フォームからの検索
公開日:
:
最終更新日:2015/12/28
php SQLインジェクション, プリペアアドステートメント
前回は、データを抽出する際の条件づけの内容を予めコード内部に
書きました。ですが、ブラウザを使いユーザーが自由に条件を指定
できればもっと便利かと思います。今回は、
ユーザーが検索データを指定
するものを作成します。
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を使ったプリペアドステートメントを
組み立てています。なので、ユーザーが指定したキーワードーを含んだ
データが取り出されます。フォームを利用することで、
ユーザーがデータを検索することができます。
関連記事
-
-
関数に複数の引数を付けてみる
これまでに定義した関数の引数は1つだけでした。 関数には2つ以上の引数を持たせることもできます、
-
-
ラジオボタンを使ってみる
タイトルの通りラジオボタンを使います。 ラジオボタン使うと、複数項目から1つだけ項目を選択できます
-
-
セッションを複数ページで共有してみる
一人のユーザーが複数のウェブページからできているサイトを 利用することがあります。その場合、セッシ
-
-
PHPデバック時に使えそうな小ネタ
タイトルの通り、プログラムを書いて実行したんだけど 動画がおかしいとき(デバッグ時)に役に立つかも
-
-
メールを送信してみる
メールを送信するためのフォームを作成してみます。 メールを送信するには、事前にPHPの設定ファイル
-
-
php数値を格納してみる
前回の記事では変数に文字列を格納しましたが、今回は数値を格納します。 サンプルコードの実行結果
- PREV
- 値を順に並べる
- NEXT
- 並び替えの方法を送信する