我有两个代码片段: 请注意$a变量如何从函数调用的外部移动到内部。
$pst = $conn->prepare("INSERT INTO TEST (Num, N, Pos, Team) VALUES (?,?,?,?)");
$a = 99;
$pst->bindParam(1, $a);
$pst->bindParam(2, $a = "badName");
$pst->bindParam(3, $a = "whoCares");
$pst->bindParam(4, $a = "Winning Team");
$pst->execute();
和
$pst = $conn->prepare("INSERT INTO TEST (Num, N, Pos, Team) VALUES (?,?,?,?)");
$pst->bindParam(1, $a = 99);
$pst->bindParam(2, $a = "badName");
$pst->bindParam(3, $a = "whoCares");
$pst->bindParam(4, $a = "Winning Team");
$pst->execute();
第一个代码段通过,而第二个代码段抛出经典的 只有变量应该通过引用错误传递。为什么会这样?为什么这只发生在第一行 - 例如,这没有发生在第一个代码段的第 2、3、4 行。
编辑问题似乎与此类似 bindParam 和 bindValue 有什么区别?,但仍然没有解释由于变量在函数调用之外设置的错误原因 - 在任何一个代码段中都设置了变量!
绑定参数 API 定义如下:
boolean PDOStatement::bindParam(mixed parameter,mixed &variable[,int datatype
[,int length[,mixed driver_options]]])
注意
mixed &variable
1 引用应该是变量!不是常量(如字符串或数字(
2 未定义$a时
value of "$a = 1" was the result of expression : 1 , so the param was 1
在定义$a之后,PHP 似乎将参数设置为 $a(我们应该挖掘 PHP 的地下机器主义 - 编译和执行(: 检查下面的代码:
function test(&$var) {
//only reference! php will check the param
echo $var;
}
try {
test($a=1);// report Only Variables should be passed by reference Error
unset($a); // delete $a
test($a=2);// report again !
} catch (Exception $e) {
echo $e->getMessage();
}