独立系プログラマーのノウハウ

$pdo->query()と、$pdo->prepare()の違い

$pdo->query()と、$pdo->prepare()の違い

$pdo->query()と、$pdo->prepare()はどちらもSQL文を実行するための命令ですが、

実行するSQL文に「代替文字列」を使いたい場合は、$pdo->prepare()の方を使います。


「代替文字列」とは、例えば、初級講座STEP21のソースコード(以下参照)のように

SQL文中ではコロン(:)で始まる文字列で指定しておき、

後でbindValue()で実際の値に差し替えるための仕組みです。


$stmt = $pdo->prepare("INSERT INTO reminder (title, remind_date) VALUES (:title, :remind_date)"); 

$stmt->bindValue(':title', $_POST["title"]); 

$stmt->bindValue(':remind_date', $_POST["remind_date"]); 

$flag = $stmt->execute();


何故このような仕組みを使うのかというと、ユーザーが画面から入力した値をそのまま

SQL文に当てはめてしまうと、悪意のある文字列を指定された場合にセキュリティホールとなるためです。

代替文字列(prepare)の仕組みを使うと、これを防ぐことができます。


そして、$pdo->prepare()を使う場合は、手順の最後で$stmt->execute()を行う必要があります。

(おっしゃる通り、prepare()とexecute()は対ということです)


逆に、今回のように代替文字列を必要としないシンプルなSQL文を実行する場合は

$pdo->query()を使うことが出来ます(こちらの方が手順が少ないため簡単です)


$pdo->query('START TRANSACTION;');


この記事を読んだ人はこんな記事も読んでいます。