【PHP講座】プレースホルダとは

プレースホルダとは

前回は、MySQL に接続して、PHP でコーディングする前の仕込みの流れなどをざっくり説明しました。

【PHP講座】MySQL入門

2019.05.14

今回は、プレースホルダについて説明します。



プレースホルダとは

簡単に言うと一時的にデータが入る場所を確保しておく仕組みのことです。

例えば、下記のような 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 利用時によく使うかと思います。