alienHRNの訓練日記

IT業界初心者で勉強中。

20201001 授業メモ

授業内容

 

 

mb_convert_kana
・指定した文字列を半角から全角に変換することができる
・変換対象は、全角数字、半角カナ、半角数字、ひらがな、カタカナ

mysqli_real_escape_string
・接続の現在の文字セットを考慮して、SQL 文で使用する文字列の 特殊文字エスケープする

■labelタグの使い方
1.文字とフォームパーツをlabelタグで囲んでグループ化する
例)ラジオボタンチェックボックスが離れている場合は「labelタグのfor属性」と
「フォームパーツのID属性」
をそろえて関連があることを定義する事。
<label>
  <input type="radio" name="hoge" value="1">
  項目1
</label>


■onclick属性
JavaScript専用属性
・イベント用属性
場所:
種類(タイミング):クリックしたとき
処理:属性値に記述されている
return confirm('一覧に戻りますか?')

confirmメソッド:確認ダイアログ画面表示
「ok」→戻り値「true」
「キャンセル」→戻り値「false」

■今回のa要素はくりっくで確認ダイアログ画面表示
「ok」→リンク先に移動する
「キャンセル」→リンク先に移動しない





下記二つのファイルは入力フォーム作成用
〇entry.phpより

<?php
// デバッグ領域表示・非表示
$debug = true;
// 自作関数定義を読み込む
require_once dirname(__FILE__. '/functions.php';
// いつものDB接続
$dbobj = mysqli_connect("localhost""Tanaka""Manager")
  or die('接続不可');
mysqli_select_db($dbobj'practice');
mysqli_set_charset($dbobj'utf8');
// SQL文をDBに投げる
$sql = 'select * from trader';
$trSet = mysqli_query($dbobj$sql)
  or die(mysqli_error($dbobj));

// 下記テーブル情報を変数trSet(traderSet)に代入
// +------+----------+---------+--------------+
// | m_id | company  | address | tell         |
// +------+----------+---------+--------------+
// |    1 | ペン工房 | 東京都  | 03-0000-0000 |
// |    2 | 小鳥文具 | 栃木県  | 028-111-1111 |
// |    3 | 黒木屋   | 島根県  | 0853-55-5555 |
// +------+----------+---------+--------------+

?>


<!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 print $sql?> </p>
    </div>
  <?php endif?>
  <div id="container">
    <div id="head">
      <h1>新規登録</h1>
    </div>
    <div id="content">
      <form action="insert.php" method="post">
        <fieldset>
          <legend>新しい商品の情報</legend>
          <dl>
            <dt><label for="item">商品名<span>※必須</span></label></dt>
            <dd><input name="item" type="text" id="item" size="20" maxlength="10"></dd>

            <dt><label for="price">価格</label></dt>
            <dd><input name="price" type="text" id="price" size="10" maxlength="10"></dd>

            <dt><label for="stock">在庫</label></dt>
            <dd><input name="stock" type="text" id="stock" size="10" maxlength="10"></dd>

            <dt><label for="keyword">キーワード</label></dt>
            <dd><input name="keyword" type="text" id="keyword" size="50" maxlength="255"></dd>
          </dl>
        </fieldset>
        <fieldset>
          <legend>メーカー情報</legend>
          <dl>
            <dt>メーカー<span>※必須</span></dt>
            <dd><?php while ($trData = mysqli_fetch_assoc($trSet)) : ?>
                <label>
                  <input name="maker" type="radio" value="<?php echo h($trData['m_id']); ?>">
                  <?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>


      <!--#content-->
    </div>
    <!--#container-->
  </div>
</body>

</html>




〇insert.phpより

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

// 三項演算子で値が届いているか確認したうえで各変数に値を代入
// 値が届いていたら「届いた値」を代入
// 値が届いていなかったら「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;

// trimとは
// 文字列の先頭・末尾にあるホワイトスペースを取り除く
// ホワイトスペースとは:半角スペース、タブ、改行など
$item = trim($item);
$price = trim($price);
$stock = trim($stock);
$keyword = trim($keyword);
$maker = trim($maker);

$sql = ''//SQL文用変数
$message = ''//ブラウザ表示用メッセージ
$btn = ''//ブラウザ表示用リンク

if ($item == '' or $maker == '') {
  // 必須項目である商品名($item)とメーカー($maker)が空文字もしくはNULL
  // ではないことを確認
  // 確認できたらエラー時の処理
  $message = '必須項目を入力してください';
  $btn = '<a href="entry.php" onclick="history.back(); return false;">
フォームに戻る</a>';
else {
  // 確認できなかったらOKの処理
  // DB接続
  $dbobj = mysqli_connect("localhost""Tanaka""Manager")
    or die('接続不可');
  mysqli_select_db($dbobj'practice');
  mysqli_set_charset($dbobj'utf8');

  // セキュリティ対策(SQLインジェクション対策)
  // mysqli_real_escape_string関数
  // 注意:第一引数に接続許可証が必要なのでDB接続後にしか使えない。
  // 第一引数:接続許可証
  // 第二引数:変数対象の文字列
  // 戻り値:クォートエスケープ後の文字列
  //DBでは意味がある記号のクォート文字をエスケープする
  // 文字列開始・終了のクォートを悪用した攻撃がある
  // DELETEの時に実演するので保留。


  // mb_convert_kana関数
  // 文字列を全角・半角等に変換する。
  // 第一引数:変数対象文字列
  // 第二引数:変換ルールを指定するオプション
  // 「n」全角数字を半角数字に変換するオプション


  // ユーザ入力する値の全角・半角のゆれを
  // mb_convert_kana関数で統一することができる
  $item = mysqli_real_escape_string($dbobj$item);
  $price = mysqli_real_escape_string($dbobjmb_convert_kana($price'n'));
  $stock = mysqli_real_escape_string($dbobjmb_convert_kana($stock'n'));
  $keyword = mysqli_real_escape_string($dbobj$keyword);
  $maker = mysqli_real_escape_string($dbobjmb_convert_kana($maker'n'));

  // sprint(string print formatted)関数
  // 第一引数:フォーマット対象文字列
  // 必要に応じて虫食い部分を作成できる
  // 虫食い部分には「%s」「%d」等を指定
  // 第二引数以降:フォーマット対象文字列に追加する値
  $sql = sprintf(
    'insert into stationery SET
item="%s",price=%d,stock=%d,keyword="%s",maker=%d',
    $item,
    $price,
    $stock,
    $keyword,
    $maker,
  );

  mysqli_query($dbobj$sql) or die(mysqli_error($dbobj));
  $message = '新規登録しました';
  $btn = '<a href="index.php">一覧に戻る</a>';
}

?>
<!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 print $sql?></p>
      <pre>$_POST:<?php var_dump($_POST); ?></pre>
    </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>