2

を使用PDOStatement::bindParam()すると、パラメーターを変数にバインドできます。これは、準備されたステートメントがそれぞれ異なるパラメーター値で複数回実行される場合に特に便利です。例えば:

$dbh = new PDO('mysql:dbname=foo', 'eggyal', 'password1');
$qry = $dbh->prepare('DELETE FROM bar WHERE qux = ?');
$qry->bindParam(1, $qux, PDO::PARAM_INT);

while (true) {
  $qux = ... ;
  $qry->execute();
  // etc
}

私の質問は次のとおりです。

  1. パラメータをオブジェクトのメンバー変数にバインドすることは可能ですか? 例えば:

    $qry->bindParam(1, $obj->qux, PDO::PARAM_INT);
    
  2. もしそうなら、どの objectのメンバー変数がそのようなパラメーターにバインドされていますか:bindParam()呼び出し時に参照されるもの、またはステートメントの実行時に参照されるもの? 例えば:

    $obj->qux = 123;
    
    $obj = new stdClass();
    $obj->qux = 456;
    
    $qry->execute();  // which value is used for qux ?
    
  3. この動作はどこに文書化されていますか (ある場合)?

4

1 に答える 1

5

PHP は変数の参照を格納して使用します。を呼び出すと$qry->bindParam(1, $obj->qux, PDO::PARAM_INT)、インスタンス化されたクラスのメンバーの参照が保存されます。

メンバーを変更しても$obj->qux、参照は に保存されているものと同じまま$objです。ただし、$obj新しいクラスに再インスタンス化すると、すべての参照が変更されますが、古いオブジェクトはまだメモリ内にあります! そのため、新しい値を new に割り当てると、$obj->qux使用される変数と同じではないため、実行$qry->executeすると古い値が使用されます。

私は十分に明確であったことを願っています。

于 2012-12-29T01:09:36.153 に答える