こんな時ありませんか
SQL文を見た時に、
INSERT INTO Pages VALUES(?, ?, ?)"
こんな感じに、一部に?
が使われている時。
どんなことになるの?
?
のところに、あとで数値を入れます。
PDOの時の例で言うと、
$dbh->prepare("INSERT INTO Pages VALUES(?, ?)") ->execute(array(1, 'Etc'));
こうすると、SQL文の ?
にexecuteの配列が順番に入って、
INSERT INTO Pages VALUES(1, 'Etc');
みたいになります。
何が嬉しいの?
SQLインジェクションと呼ばれるWebサイトの攻撃対策になります。
ユーザーが意図して悪い入力をすることで、パスワードが漏洩したりするのを防ぐ事ができます。
普通に書くと困る理由
$dbh->exec("INSERT INTO Pages VALUES(" . $id . "," . $name .")");
こんな感じだとなぜダメなのか。
例えば、今回の例で言うと、$idと$nameに入る値をユーザーに入力させる時に、
$id = 1; $name = "ETC); SELECT * From Pages;(";
という入力がされると、SQL文は
INSERT INTO Pages VALUES(1, ETC); SELECT * From Pages;()
SELECT * From Pages;
が余分に実行されます。
もし、SQL文の結果を出力するシステムなら、Pagesテーブルの内容がユーザーに見られてしまう。
ただ、 ?
を使うことによって、
VALUEの第一引数は1、
第二引数は"ETC); SELECT * From Pages;("という文字列、と捉えてくれるようになります。