※この記事は「2021年4月15日」に更新しました。
PHP講座です。
前回は、MySQL に接続して、PHP でコーディングする前の仕込みの流れなどをざっくり説明しました。
今回は、プレースホルダについて、説明します。
プレースホルダとは
プレースホルダは、簡単に言うと一時的にデータが入る場所を確保しておく仕組みのことです。
例えば、下記のような SQL文があるとします。
SELECT * FROM users WHERE id = 3
これを以下のように書き換えてみます。
SELECT * FROM users WHERE id = ?
こうすると ? に入る値によって、データが変化するわけです。
これが、プレースホルダです。
SQLインジェクション対策にもなる
プレースホルダは、SQL を安全かつ簡単に実行するためのものでもあります。
ちなみに SQLインジェクションは渡すパラメータを操作し、元々想定されていない処理を SQL として実行されることです。
しかし、プレースホルダを利用して、可変値をとりあえず確保しておき、埋め込む値は SQL と分離して渡すことで安全に実行できるというわけです。
PDO 利用時のプレースホルダ記述例
以前にも紹介しましたが、PHP からデータベースに接続するには、PDO を利用することが多いです。
PDO 利用時のプレースホルダ記述例を紹介します。
$stmt = $dbh->prepare("INSERT INTO users (name, age) VALUES (?, ?)") $name = "pasota"; $stmt->bindValue(1, $name, PDO::PARAM_STR); $age = 36; $stmt->bindValue(2, $age, PDO::PARAM_INT); $stmt->execute();
変数 dbh は、データベースを利用する準備ができていると仮定します。
prepareメソッドは、プレースホルダを利用して SQL を発行することができます。
? とすることで一時的にデータが入る場所を確保しています。
そして、bindValueメソッドを使うことでプレースホルダと実際の値をバインド(結合)しています。
最後に executeメソッドで SQL を実行しています。
bindParamメソッドについて
bindValueメソッドと似ているもので bindParamメソッドというものもあります。
bindValueメソッドは、値をバインドするのですが、bindParamメソッドは変数の参照値がバインドされます。
bindParamメソッドは注意して使う必要がありそうですが、一応覚えておきましょう。
名前付きパラメータを指定することもできる
prepareメソッドのプレースホルダは、? 以外に名前付きパラメータを指定することもできます。
$stmt = $dbh->prepare("INSERT INTO users (name, age) VALUES (:name, :age)") $name = "pasota"; $stmt->bindValue(:name, $name, PDO::PARAM_STR); $age = 36; $stmt->bindValue(:age, $age, PDO::PARAM_INT); $stmt->execute();
パラメータの数が増えてくると、こちらの方がわかりやすいかもしれません。
最後に
いかがでしょうか。
プレースホルダを利用した SQLステートメントを準備し、値をバインドして、実行する。
今回の内容も PDO 利用時によく使うかと思います。