sit in a circle and chat happily

データベース 7日目

投稿日:2022-02-08
更新日:2022-03-24
db

★ここからグループ作業に突入★

商品情報編集フォームを作成する

基本的な作りは新規商品入力フォームと同じ。異なる点は、編集前の値が編集フォームに表示されている。

<?php
session_start();
$debug = true;
require_once dirname(__FILE__) . '/functions.php';

$dbobj = connectPractice();
// DBに接続・接続許可証をもらう

$sql1 = 'SELECT * FROM trader';  //メーカー名
$trSet = mysqli_query($dbobj, $sql1) or die(mysqli_error($dbobj));
// traderテーブルを入れる

// mysqli_query関数:SQL文をDBに渡す
// (接続許可証, SQL文'SELECT * FROM trader')
// ◆第1条件(ORの左辺)
// mysqli_query関数の結果を$trSetに代入
// 変数$trSet内の値を評価
// SQL文実行OK:変数$trSetにテーブル情報代入
//   第1条「true」 → 第2条件を確認(実行)しない
// SQL文実行NG:false
//   第1条件「false」 → 第2条件を確認(実行)して処理停止
// ◆第2条件(ORの右辺)
// mysqli_error関数でDBからエラーメッセージを取得して
// 表示した後に処理停止

$bl = false;
// 判定用変数(真偽値)
// ■ビューファイルでの表示内容を変更する
// ■true:フォームを表示
// ■false:「不正な処理です」
$sql2 = '';  //stationeryのid番号

if (isset($_GET['id'])) {
  // idの値が届いていたら・・・
  $id = $_GET['id'];
  $_SESSION['id'] = $id;

  // 使用しやすい変数名に値を代入
  $sql2 = sprintf(
    'SELECT * FROM stationery WHERE id=%d',
    mysqli_real_escape_string($dbobj, $id)
  );
  // ■stationeryテーブルから対象の商品を取得
  // セキュリティを考慮してSQL文を作成
  // ・mysqli_real_escape_string関数
  // ・sprintf関数
  // 値をキレイにして表示

  $stSet = mysqli_query($dbobj, $sql2) or die(mysqli_error($dbobj));
  //stationeryのid番号
  // mysqli_query関数:SQL文をDBに渡す
  // (接続許可証, SQL文)
  // ◆第1条件(ORの左辺)
  // mysqli_query関数の結果を$stSetに代入
  // 変数$stSet内の値を評価
  // SQL文実行OK:変数$stSetにテーブル情報代入
  //   第1条「true」 → 第2条件を確認(実行)しない
  // SQL文実行NG:false
  //   第1条件「false」 → 第2条件を確認(実行)して処理停止
  // ◆第2条件(ORの右辺)
  // mysqli_error関数でDBからエラーメッセージを取得して
  // 表示した後に処理停止

  $bl = mysqli_affected_rows($dbobj);  // 判定用変数
  // ■SELECT * FROM stationery WHERE id=%d
  // ■上記SQL文の実行結果を変数blに代入
  // ■編集する商品を取得できているか確認
  // mysqli_affected_rows()・・・レコード件数を調べる
  //  直前に実行したSQL文で影響を受けたレコード数を代入
  // 戻り値「1」か「0」
  // 「0」登録されていない、存在しない

  $stData = mysqli_fetch_assoc($stSet);
  // 該当レコードを連想配列に変換して代入
}

?>
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <link href="style.css" type="text/css" rel="stylesheet">
  <title>商品管理システム</title>
</head>

<body>
  <?php if ($debug) : ?>
    <div class="debug">
      <p>デバッグ用</p>
      <p>$sql1:<?php print $sql1; ?></p>
      <p>$sql2:<?php print $sql1; ?></p>
      <p>mysqli_affected_rows($dbobj):<?php print mysqli_affected_rows($dbobj); ?> </p>
    </div>
  <?php endif; ?>
  <div id="container">
    <div id="head">
      <h1>商品編集</h1>
    </div>
    <div id="content">


      <!-- 判定用変数$blを使用して、表示する内容を変更する -->
      <?php if ($bl) : ?>
        <!-- 商品がある場合 -->
        <!-- function h($var) → エスケープ処理 -->
        <form action="update.php" method="post">
          <fieldset>
            <legend>商品情報を変更</legend>
            <p>ID:<?php echo h($stData['id']); ?>
              <!-- SESSION を使う場合隠しパーツは不要 -->
              <!-- <input name="id" type="hidden" value="<?php echo h($stData['id']); ?>"> -->
              <!-- 隠しフォームを使ってupdate.phpに値を送る -->
            </p>
            <dl>
              <dt><label for="item">商品名 <span>※必須</span></label></dt>
              <dd>
                <input name="item" type="text" id="item" size="20" maxlength="10" value="<?php echo h($stData['item']); ?>">
              </dd>

              <dt><label for="price">価格</label></dt>
              <dd><input name="price" type="text" id="price" size="10" maxlength="10" value="<?php echo h($stData['price']); ?>">円</dd>

              <dt><label for="stock">在庫</label></dt>
              <dd><input name="stock" type="text" id="stock" size="10" maxlength="10" value="<?php echo h($stData['stock']); ?>"></dd>

              <dt><label for="keyword">キーワード</label></dt>
              <dd><input name="keyword" type="text" id="keyword" size="50" maxlength="255" value="<?php echo h($stData['keyword']); ?>"></dd>
            </dl>
          </fieldset>
          <fieldset>
            <legend>納入先の情報</legend>
            <dl>
              <dt>メーカー<span>※必須</span></dt>
              <dd>
                <?php
                // ラジオボタンを作成するwhile文
                while ($trData = mysqli_fetch_assoc($trSet)) :
                  // 該当レコードを連想配列に変換して代入
                  $ck = '';  //checked属性用の変数
                  // ラジオボタンに編集前の値を設定(あらかじめチェックを入れる)
                  if ($trData['m_id'] == $stData['maker']) {
                    // 作成するラジオボタンのメーカー
                    // == 編集するレコードのメーカーが一致するか判定
                    $ck = ' checked="checked"';
                    //checked属性用の変数にchecked="checked"を代入
                  } ?>
                  <label>
                    <input name="maker" type="radio" value="<?php echo h($trData['m_id']); ?>" <?php echo $ck; ?>>
                    <?php echo h($trData['company']); ?>
                  </label>
                <?php endwhile ?>
              </dd>
            </dl>
          </fieldset>
          <div class="submit_btn"><input type="submit" value="変更"></div>
        </form>
        <p><a href="index.php" onclick="return confirm('一覧に戻りますか?')">
            一覧に戻る</a></p>
      <?php else : ?>
        <p>不正な処理です</p>
        <p><a href="index.php">一覧に戻る</a></p>
      <?php endif; ?>
      <!--#content-->
    </div>
    <!--#container-->
  </div>
</body>
</html>

編集するレコードの値を取得する

index.phpの編集リンクのクエリ文字列で送られてきたid番号をもとに編集するレコード情報を取得する。

 $sql2 = sprintf('SELECT * FROM stationery WHERE id=%d',
    mysqli_real_escape_string($dbobj, $id)
  );
  $stSet = mysqli_query($dbobj, $sql2) or die(mysqli_error($dbobj));

該当レコードを連想配列に変換し、$stDataに代入する。

$stData = mysqli_fetch_assoc($stSet);

商品が登録されていない、存在しないIDを受け取った時の対応

  $sql2 = sprintf('SELECT * FROM stationery WHERE id=%d',
    mysqli_real_escape_string($dbobj, $id)
  );
  $stSet = mysqli_query($dbobj, $sql2) or die(mysqli_error($dbobj));
  $bl = mysqli_affected_rows($dbobj);

判定用変数$blを使用して表示する内容を変更する。

<?php if ($bl): ?>
  【編集商品が存在するときの対応】
<?php else: ?>
  【編集商品が存在しなかったときの対応】
<?php endif; ?>

ID番号の表示と隠しフォーム

DBから取得したID番号を表示すると共に、inputタグのtype属性に「hidden」を設定した隠しフォームを作成する。隠しフォームは入力欄をブラウザに表示することなく値を送信先に渡すことができる。

今回は編集するデータを指し示すID番号を隠しフォームを使ってupdate.phpに送っている。

<p>ID:<?php echo h($stData['id']); ?>
  <input name="id" type="hidden" value="<?php echo h($stData['id']); ?>">
</p>

テクストボックスに編集前の値を表示

テキストボックスのvalue属性にDBから取得した値を設定。これにより変種前の値あテキストボックスに表示されるようになる。

<input name="item" type="text" id="item" size="20" maxlength="10" 
value="<?php echo h($stData['item']); ?>">

ラジオボタンに編集前の値を設定

ラジオボタンをチェック済みにするにはchecked属性を追加する。まずはchecked属性用の$ckを用意し空文字を代入しておく。

作成するラジオボタンのメーカー($trData[‘m_id’])と編集するレコードのメーカー($stData[‘maker’])が一致するかif文で判定する。一致した場合は$ckにチェック済み指定する「 checked=”checked”」を代入する。

$ck = '';
if ($trData['m_id'] == $stData['maker']) {
  $ck = ' checked="checked"';
} ?>

一致したメーカーのラジオボタンには$ckに代入された「checked=”checked”」が追加されチェック済みになる。

<input name="maker" type="radio" value="<?php echo h($trData['m_id']); ?>" 
<?php echo $ck; ?>>

一致した時に生成されるソースコード

<input name="maker" type="radio" value="1" checked="checked">

一致しなかった時に生成されるソースコード

<input name="maker" type="radio" value="1">

編集したデータをデータベースに登録

編集用フォーム「change.php」から送られてきた値を取得し、DBに登録する。必須項目入力チェックなど基本構造は新規商品登録ページ「insert.php」と同じ。

<?php
session_start();
// デバッグ用
$debug = true;

// 共通関数読み込み
require_once dirname(__FILE__) . '/functions.php';

// 値が届いているか
// 値が届いていれば値変数代入
// 値が届いていなければ「NULL」代入
// $id      = isset($_POST['id'])      ? $_POST['id']      : NULL;
$id      = isset($_SESSION['id'])   ? $_SESSION['id']      : NULL;
$item    = isset($_POST['item'])    ? $_POST['item']    : NULL;
$price   = isset($_POST['price'])   ? $_POST['price']   : NULL;
$stock   = isset($_POST['stock'])   ? $_POST['stock']   : NULL;
$keyword = isset($_POST['keyword']) ? $_POST['keyword'] : NULL;
$maker   = isset($_POST['maker'])   ? $_POST['maker']   : NULL;

// ホワイトスペースの削除
$id      = trim($id);
$item    = trim($item);
$price   = trim($price);
$stock   = trim($stock);
$keyword = trim($keyword);
$maker   = trim($maker);

// SQL用変数
$sql = '';
// 表示用メッセージ用変数
$message = '';
// ページ遷移用表示ボタン用変数
$btn = '<a href="index.php">一覧に戻る</a>';

//
if ($id == '') { //idに値がなかったら
  // なかった時の処理
  $message = '不正な処理です'; //$messageに代入
} else {
  // あった時の処理
  if ($item == '' or $maker == '') {
    //必須項目が空文字だったら
    $message = '必須項目を入れてください'; //$messageに代入
    $btn = '<a href="change.php?id=' . h($id) . '"onclick="history.back(); return false;">フォームに戻る</a>';
    //$btnに代入
    // ■履歴で戻るので、値は元のフォームに残る
  } else {
    // 必須項目が入力されている場合
    // DB接続し許可証取得
    $dbobj = connectPractice();
    // 【接続許可証】
    // DBに接続・領域選択・文字化け対策
    $sql = sprintf(
      // %s 文字列
      // %d 数値
      // 書式を整える
      'UPDATE stationery SET item="%s", price=%d, stock=%d, keyword="%s",maker=%d WHERE id=%d',

      // クォートをエスケープ処理
      // mysqli_real_escape_string()関数
      // 特殊文字をエスケープ
      // mb_convert_kana()'n'
      // 全角から半角へ変換
      mysqli_real_escape_string($dbobj, $item),
      mysqli_real_escape_string($dbobj, mb_convert_kana($price, 'n')),
      mysqli_real_escape_string($dbobj, mb_convert_kana($stock, 'n')),
      mysqli_real_escape_string($dbobj, $keyword),
      mysqli_real_escape_string($dbobj, mb_convert_kana($maker, 'n')),
      mysqli_real_escape_string($dbobj, $id)
    );

    // SQL実行または(出来なかったらエラーを返す)
    mysqli_query($dbobj, $sql) or die(mysqli_error($dbobj));
    // 出来た時
    $message = 'ID' . h($id) . 'を修正しました。'; //$messageに代入
  }
}
unset($_SESSION['id']);
?>
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <link href="style.css" type="text/css" rel="stylesheet">
  <title>商品管理システム</title>
</head>

<body>
  <?php if ($debug) : ?>
    <div class="debug">
      <p>デバッグ用</p>
      <p>$sql:<?php v($_POST) ?></p>
    </div>
  <?php endif; ?>

  <div id="container">
    <div id="head">
      <h1>商品編集</h1>
    </div>
    <div id="content">
      <p><?php echo $message; ?></p>
      <!-- メッセージを表示 -->
      <p><?php echo $btn; ?></p>
      <!-- ボタン内容を表示 -->
      <!--#content-->
    </div>
    <!--#container-->
  </div>
</body>
</html>

変更した値をデータベースに登録

隠しフォームから送られてきたID番号を使って変更するレコードを絞り込む。あとは各フィールドから送られてきた値を使用してUPDATE文を完成させ実行する。

sprintf('UPDATE stationery SET item="%s", price=%d, stock=%d, keyword="%s",
  maker=%d WHERE id=%d',
   mysqli_real_escape_string($dbobj, $item),
   mysqli_real_escape_string($dbobj, mb_convert_kana($price, 'n')),
   mysqli_real_escape_string($dbobj, mb_convert_kana($stock, 'n')),
   mysqli_real_escape_string($dbobj, $keyword),
   mysqli_real_escape_string($dbobj, mb_convert_kana($maker, 'n')),
   mysqli_real_escape_string($dbobj, $id)
);

CRUDシステム

ここまで作成したページで商品を「登録(Create)」「一覧表示(Read)」「編集(Update)」「削除(Delete)」できるようになった。この4つの操作がDBを利用したシステムの基本となり、頭文字を取って「CRUD(クラッド)」と呼ばれる。

商品の検索

・・・コレは今後必要になったら解読して使用してみる!

カテゴリー