前回は、データを抽出する際の条件づけの内容を予めコード内部に
書きました。ですが、ブラウザを使いユーザーが自由に条件を指定
できればもっと便利かと思います。今回は、
ユーザーが検索データを指定
するものを作成します。
SQLインジェクション
例えば、ユーザーが検索データを入力する際には注意が必要です。
次のような文で検索する場合を考えます。
SELECT * FROM product WHERE price=***
「***」はフォームの値です。
このよきユーザーが以下のようなSQL文を含む分を入力してしまうと
データベース中のデータが削除されてしまいます。
SELECT * FROM product WHERE price=***
300; DELETE FROM product;
上記のように不正なSQL文を入力されることにより
データベースが不正に操作されることを
SQLインジェクションといいます。
プリペアアドステートメントの仕組み
上記の問題を防ぐのに、SQL文でプリペアアドステートメント
(prepared statement プリペアド文)とすることが普通です。
この文は検索に使うSQL文の構造を、予め確定させておくものです。
SQL文の構造が確定されているので、実行時にユーザーによって
不正なSQL文が入力されても、その文が実行されるのを防ぎます。
1.プリペアドステートメントを作成
プリペアドステートメントは、SQL文中に検索条件をプレースホルダーと
呼ばれる仕組みとして作成します。
2.変数をバインドする
次にこのプレースホルダーとフォームの値が記憶される変数と
関連付ける(バインドする)こと。
3.実行する
プリペアドステートメントを実行する際に、
プレースホルダーが入力されてあ値に
書き換えられるようになっています。
SELECT * FROM product WHERE price = :プレースホルダ;
$que = "SELECT * product WHERE price = :pr;
//1.プリペアドステートメント作成
$stmt = $db->prepare($que)
//2.変数をバインドする
$stmt->bindParam(:pr,$pr);
//3.実行する
$stmt->execute();
サンプルコードの実行結果はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
<!doctype html> <html> <head> <meta charset="utf-8"> <title>SQL プリペアドステートメントのサンプル</title> <link rel="stylesheet" href="../style.css"> </head> <body> <?php $dbName ="sqlite:test.db"; $uName = ""; $pw = ""; $db = new PDO($dbName,$uName,$pw); $word = null; if( isset($_POST["word"]) ) $word = $_POST["word"]; $que = "SELECT * FROM product WHERE name LIKE :word"; $word = "%" . $word . "%"; //プリペアドステートメントを作成 $stmt = $db->prepare($que); //変数をバイント $stmt->bindParam(":word", $word); //実行する $stmt->execute(); ?> <table border="2"> <tr bgcolor="#b0b0b0"> <th>番号</th> <th>商品</th> <th>単価</th> </tr> <?php while( $value = $stmt->fetch() ){ $id = $value["id"]; $name = $value["name"]; $price = $value["price"]; echo "<tr>" . "<td>{$id}</td>" . "<td>{$name}</td>" . "<td>{$price}</td>" . "</tr>"; } $db = null; ?> </table> <form action="" method="post"> <!-- "word"と名付けられた テキストボックスのデータで検索する --> <input type="text" name="word"> <input type="submit" value="検索"> </form> </body> </html> |
ユーザーは、フォームのテキストボックスに検索するキーワードを
入力し、検索ボタンを押します。このキーワードーは
$_POST["word"]に格納されます。
コード中では、この値を使いLKEを使ったプリペアドステートメントを
組み立てています。なので、ユーザーが指定したキーワードーを含んだ
データが取り出されます。フォームを利用することで、
ユーザーがデータを検索することができます。