PDO通过引用通知?

时间:2011-07-21 03:06:38

标签: php pdo pass-by-reference

此:

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

无怨无悔地跑。

我不明白这个区别?

4 个答案:

答案 0 :(得分:9)

PDOStatement::bindParam()的描述表明它将PHP 变量绑定到quesitonmark或命名占位符。由于您尝试传递类的方法(即使该方法确实返回值),它仍然不是变量名,因此警告。您可能希望查看PDOStatement::bindValue()以便将来验证您的代码。

答案 1 :(得分:6)

bindParam的第二个参数是变量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();

使用函数返回将无法实现。

答案 2 :(得分:2)

如果您想避免将值分配给变量,最好不要尝试:

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

正如其他人所提到的,错误是由于PDO::statement->bindParam期望param 2是通过引用传递的变量引起的。

答案 3 :(得分:-1)

如果你真的想要绑定一个值而不是一个引用,你可以使用PDOStatement::bindValue然后代码看起来像这样:

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