此:
$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();
无怨无悔地跑。
我不明白这个区别?
答案 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();