フォーム入力からデータベースを検索する

MySQLを操作する

  1. HOME
  2. 検索

支部を検索する

プレースホルダーに値をバインドする
bindValue(プレースホルダー,値,値の型)

プリペアドステートメントを作った後から、プレースホルダに値をバインドします。変数に値を代入するようなもの!

定数 PHPでのデータ型 MySQLでのデータ型
PDO::PARAM_STR string VARCHAR,TEXTなどの文字列型
PDO::PARAM_INT int,floatなどの数値 INT,FLOATなどの数値型
PDO::PARAM_BOOL boolean(論理値) 論理値
PDO::PARAM_LOB string BLOBなどのラージオブジェクト型
PDO::PARAM_NULL null NULL

セキュリティ対策

フォーム入力から悪意のあるSQL文を送信し、データベースをハッキングするSQLインジェクションに対策するためには、プレースホルダを使ってSQL文を記述してプリペアドステートメントを作ります。プレースホルダの値をbindValue()を使ってバインドすることで、SQLエスケープも同時に行われSQLインジェクション対策として有効な手段になります。

フォーム

<form method="POST" action="search.php">
<ul>
  <li>
    <label>支部を検索:<br>
      <input type="text" name="branch" placeholder="支部名を入力">
    </label>
  </li>
  <li><input type="submit" value="検索する"></li>
</ul>
</form>

データベース検索コード

<?php
require_once("../common/es.php"); //PHPのフォーム~入力データのチェック~で参照してね
$backURL = "searchForm.php";

if (!checkEn($_POST)) { //エンコードチェック
  header("Location:{$backURL}");
  exit();
}

if (empty($_POST)) { //空の時エラー
  header("Location:{$backURL}");
  exit();
} else if (!isset($_POST["branch"]) || ($_POST["branch"] === "")) {
  header("Location:{$backURL}");
  exit();
}

//接続パラメーター
$user = '****';
$passwoed = '****';
$dbName = 'kyotei';
$host = 'localhost:8888';
$dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
?>

<!doctype html>
<html lang="ja">
・・・・↓↓

<?php
$branch = $_POST["branch"];
try {
  $pdo = new PDO($dsn, $user, $passwoed);
  $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $sql = "SELECT*FROM classic2022 WHERE branch LIKE(:branch)"; //SQL文
  $stm = $pdo->prepare($sql); //プリペアドステートメント作成
  $stm->bindValue(':branch', "%{$branch}%", PDO::PARAM_STR);
  $stm->execute(); //SQL文の実行
  $result = $stm->fetchAll(PDO::FETCH_ASSOC);
  if (count($result) > 0) {
    echo "{$branch}支部の出場選手";
    echo "<table border=1>";
    echo "<tr>";
    echo "<th>", "登録番号", "</th>";
    echo "<th>", "選手名", "</th>";
    echo "<th>", "登録期", "</th>";
    echo "<th>", "支部", "</th>";
    echo "</tr>";

    foreach ($result as $row) {
      echo "<tr>";
      echo "<td>", es($row['number']), "</td>";
      echo "<td>", es($row['name']), "</td>";
      echo "<td>", es($row['reg']), "</td>";
      echo "<td>", es($row['branch']), "</td>";
      echo "</tr>";
    }
    echo "</table>";
  } else {
    echo "{$branch}支部の選手は見つかりませんでした。";
  }
} catch (Exception $e) {
  echo '<span class="error">エラーがありました</span><br>';
  echo $e->getMessage();
}
?>
<HR>
<p><a href="<?php echo $backURL ?>">戻る</a></p>