解释使用 PreparedStatement PHP 按引用传递


Explain Passing by Reference using a PreparedStatement PHP

我有两个代码片段: 请注意$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();
}