クロピグログ

職業訓練で学んだことまとめ

【DB授業七日目】MariaDB+PHP(続き3)

insert.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;

 

●打ち込みミス対策

文字列の先頭・末尾にあるホワイトスペースを取り除く
ホワイトスペース:半角スペース、改行、タブ等
$item    = trim($item);
$price   = trim($price);
$stock   = trim($stock);
$keyword = trim($keyword);
メーカーを選択しないとNULLが代入される
$maker   = trim($maker);

 

●使う変数代入

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

 

●必須項目である商品名($item)とメーカー($maker)が空文字もしくはNULLであることを確認

if ($item == '' or $maker == '') {
確認出来たら、エラー時の処理
  $message = '必須項目を入力してください';
  $btn = '<a href="entry.php
onclick="history.back(); return false;">フォームに戻る</a>';※1
else {
確認できなかったら、OKの処理
  DB接続
  $dbobj = mysqli_connect('localhost''Tanaka''Manager'
or die(mysqli_error($dbobj));
  mysqli_select_db($dbobj'practice');
  mysqli_set_charset($dbobj'utf8');

 

 ※1

<a href="entry.php"  onclick="history.back(); return false;">
 フォームに戻る</a>

 ◆JS処理について

onclick="history.back(); return false;"

●イベント

・場所:a処理

・種類:click

・処理 :

history.back(); 1つ前の履歴に戻る

履歴を使って戻るとユーザ入力値が維持されているので簡易的に値を維持して入力画面に戻すことができる

※本当ならばPHPテキスト最後のSESSIONが望ましい

return false;

イベント(onclick)に対して真偽値「false」を返す要素にブラウザ標準の挙動が設定されていた時、その挙動をストップ
a要素のclickイベントにfalseを返すとhref属性を使ったページ遷移をストップさせる

「href="javascript:void(0)"」だと、もしJS使えない時にページ遷移できなくなるので、

「href="entry.php"」にしている

 

 ●セキュリティ対策(SQLインジェクション対策)

$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'));

◆mysqli_real_escape_string関数

 ・第1引数:接続許可証

 ・第2引数:変換対象の文字列

 ・戻り値:クォートエスケープ後の文字列

 ★注意!第1引数に接続許可証が必要なのでDB接続後にしか使えない

 ・データベースで意味のある記号である

 ・クォート文字をエスケープする

 ・文字列開始・終了のクォートを悪用した攻撃がある

 ・DELETEの時に実演するので保留

◆mb_convert_kana関数

 ・文字列を全角・半角等に変換

 ・第1引数:変換対象文字列

 ・第2引数:変換ルールを指定するオプション

 ・「n」全角数字を半角数字に変換(SQL文で実行できるようにするため)

 ・ユーザが入力する値の全角・半角のゆれをmb_convert_kana関数で統一することができる

 

 ●SQLでテーブル表示する

  $sql = sprintf(
    'INSERT INTO stationery
    SET item="%s", price=%d, stock=%d, keyword="%s", maker=%d',
           文字列      数値       数値        文字列      数値
    $item1番目の虫食い部分に入る値
    $price2番目の虫食い部分に入る値
    $stock3番目の虫食い部分に入る値
    $keyword4番目の虫食い部分に入る値
    $maker  5番目の虫食い部分に入る値
  );

◆sprintf(string print formatted)関数

 第1引数:フォーマット対象文字列

 必要に応じて虫食い部分を作成できる

 虫食い部分には「%s」「%d」用を指定

 第2引数以降:フォーマット対象文字列の虫食い部分に追加する値

 「%s」は文字列が入る予定の虫食い部分

 「%d」は数値が入る予定の虫食い部分

 もし数値に変換できない値の場合は「0」に置き換えられる

 

 

 

●完了後に表示する内容

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