この記事でわかること
- PHPのPDOクラスの関数
bindValue()
の仮引数の中身がわかる
そもそもbindValue()とは
public PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] ) : bool
プリペアドステートメントで使用する SQL 文の中で、 対応する名前あるいは疑問符のプレースホルダに値をバインドします。
PHP公式リファレンス
ものすごく雑に要約すると、bindValue()とは、
下記SQLクエリ文の"?"部分を別の文字列に置換することができる関数です。
SQLインジェクション対策ですね。
$sql = "insert into phptodo (name, done, priority) values (?, 0, ?)";
特に、プリペアドステートメント?PDO?な方は、こちらの記事にまとまっているので参照すると幸せになれます。
SQLインジェクション?という方は、安全なWebサイトの作り方を参照すると幸せになれます。
なお、bindValue()は第三引数まで取ります。
bindValue()の各引数について考える
サンプルコード
$name = "hoge"
$priority = "high"
$sql = "insert into phptodo (name, done, priority) values (?, 0, ?)"; // SQLインジェクション対策のプレースホルダ(=?)
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $priority, PDO::PARAM_STR);
$stmt->execute();
// $sql = "insert into phptodo (name, done, priority) values ("hoge", 0, "high")"
// となる
bindValue()の第一引数
どのプレースホルダ( $sql
内の"?"のこと ) に関数を適用するかを数字で指定します。
例えばサンプルコードでは values(?, 0, ?)となっているので、
values内の第一引数の "?" に変更を加えたい場合 => 1
values内の第三引数の "?" に変更を加えたい場合 => 2
と記述します。
数字は0ではなく1から始まるので注意!
bindValue()の第二引数
第一引数で指定したプレースホルダに何を代入するかを指定します。
ここでは変数 $name
や $priority
を代入しています。
bindValue()の第三引数
第二引数で指定した内容をどのようなデータ型にするかを指定します。
PDO::PARAM_INT
PDO::PARAM_STR
など
これらはInteger型の定数で、例えばPDO::PARAM_STR
はInteger型の2
を表しています。
(このため、PDO::PARAM_STR
ではなく2
と記述しても同等の内容が実行されます)
print(PDO:PARAM_STR)
// 2
他の定数はここ
プレースホルダに"?"を使わない方法
蛇足ですが、プレースホルダを任意の文字列にして可読性を高める方式もあります。
SQL文の"?"を:hoge
や:fuga
として、
更にbindValue()
の第一引数を数字ではなく":hoge"
や":fuga"
と指定します。
サンプルコード
$sql = "insert into phptodo (name, done, priority) values (:name, 0, :priority)";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(":name", $name, PDO::PARAM_STR);
$stmt->bindValue(":priority", $priority, PDO::PARAM_STR);
$stmt->execute();