2011-07-21 3 views
8

この:PDO合格通知は?

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$stmt->bindParam(':color', $someClass->getColor()); 
$stmt->execute(); 

この得られます

ランタイム予告
変数のみが 参照

それはまだ実行してもで渡す必要があります。

この:文句なし

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$tempColor = $someClass->getColor(); 
$stmt->bindParam(':color',$tempColor); 
$stmt->execute(); 

実行されます。

違いは分かりませんか?

答えて

6

bindParamの2番目のパラメータは、変数referenceです。関数の戻り値は参照できないので、bindParamパラメータの要求を厳密に満たすことはできません(PHPはあなたと連動しますが、ここでは警告のみを発行します)。より良いアイデアを得るために

は、ここだと例:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$tempColor = NULL; // assigned here 
$stmt->bindParam(':color',$tempColor); 
$tempColor = $someClass->getColor(); // but reassigned here 
$stmt->execute(); 

関数の戻り値で行うことはできません。このコードは、あなたの第二の例と同じ結果が得られます。

9

PDOStatement::bindParam()の説明では、PHP 変数をquesitonmarkまたは名前付きプレースホルダーにバインドしています。クラスのメソッドを渡そうとしているので(たとえそのメソッドが値を返すとしても)、変数名ではないので、警告になります。あなたのコードを将来的に証明するためにPDOStatement::bindValue()を見たいかもしれません。

2

あなたは変数に値を代入避けたい場合は、しようとしたほうが良いかもしれません。他の人が述べたようにPDO::statement->bindParamはPARAM 2は、変数がで渡されることを期待しているため

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = ?"); 
$stmt->execute(array($someClass->getColor())); 

、エラーが発生します参照。

-1

あなたは本当に代わりに参照の値をバインドしたい場合は、あなたがPDOStatement::bindValueを使用することができ、その後、あなたはコードは次のようなものになります。

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$stmt->bindValue('color', $someObject->getColor()); 
$stmt->execute();