2012-12-29 135 views
2

使用PDOStatement::bindParam(),可以將一個參數綁定到一個變量—,這對於準備好的語句多次執行時非常有用,每個語句都有不同的參數值。例如:是否可以將PDO參數綁定到對象的成員變量?

$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. 如果是這樣,到哪個對象的成員變量是結合這樣的參數:其被在bindParam()呼叫,的時間基準,或者其在語句執行引用?例如:

    $obj->qux = 123; 
    
    $obj = new stdClass(); 
    $obj->qux = 456; 
    
    $qry->execute(); // which value is used for qux ? 
    
  3. 此行爲在哪裏記錄(如果有的話)?

+2

它在綁定時綁定到對象的實例屬性。創建一個新對象並將其分配給以前的對象變量名稱將不會更新該引用。 – mario

+0

同意。如果您一次將多個對象保存到數據庫中,我是否可以建議在事務內部重寫此對象? (如果你的引擎支持它。) – FredTheWebGuy

回答

5

PHP存儲變量的引用來使用它。當您致電$qry->bindParam(1, $obj->qux, PDO::PARAM_INT)時,存儲的引用是實例化類的成員的引用。

當您更改成員$obj->qux時,引用仍然與$obj中存儲的引用相同。但是,如果您將$obj重新轉化爲新類,則每個引用都會更改,但您的舊對象仍在內存中!因此,當您爲新的$obj->qux分配一個新值時,它與使用的變量不同,因此運行$qry->execute將使用舊值。

我希望我已經清楚了。

相關問題