php

フォームからの検索

前回は、データを抽出する際の条件づけの内容を予めコード内部に
書きました。ですが、ブラウザを使いユーザーが自由に条件を指定
できればもっと便利かと思います。今回は、

ユーザーが検索データを指定

するものを作成します。

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();

サンプルコードの実行結果はこちら

ユーザーは、フォームのテキストボックスに検索するキーワードを
入力し、検索ボタンを押します。このキーワードーは
$_POST["word"]に格納されます。

コード中では、この値を使いLKEを使ったプリペアドステートメントを
組み立てています。なので、ユーザーが指定したキーワードーを含んだ
データが取り出されます。フォームを利用することで、
ユーザーがデータを検索することができます。

-php
-,