LoginSignup
6
6

More than 3 years have passed since last update.

bindValue()の仮引数は何を示しているのか?

Last updated at Posted at 2020-09-08

この記事でわかること

  • 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();

参考

6
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6