首页 > 解决方案 > 如果我通过数组索引传递参数,为什么 MySQLi 准备好的语句不起作用?

问题描述

为什么这不返回任何 MySQL 行:

$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $array[0]);
$array = array(1);
$sql -> execute();

但是当我把数组放在bind_param它工作之前。它是这样工作的:

$sql = $conn -> prepare("select * from table where id = ?");
$array = array(1);
$sql -> bind_param('i', $array[0]);
$sql -> execute();

或者

$array = array(1);
$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $array[0]);
$sql -> execute();

标签: phpmysqliprepared-statementbindparam

解决方案


mysqli_statement::bind_param($types, &$var1)通过引用接受变量。因此,它旨在处理尚未定义的变量

通常你可以这样做

$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $i);
$i = 1;
$sql -> execute();

它会完美无缺。

但是,数组是另一回事。就像我在评论中提到的@mario 一样,引用未声明的变量会自动定义它。因此,当您引用一个变量时(在这里$sql->bind_param('i', $array[0]);您实际上是在这样做),两者$array都会$array[0]被创建。哪里$array[0]有参考。

您是否为此变量分配了一个值,即$array[0] = 1;,它会起作用。但是您为整个数组
分配了一个全新的值。因此,它现在包含的不是引用,而是一个新值。

上面可以用一个简单的代码片段来说明

如您所见,只要保留原始数组成员,引用就会保留。
但是,一旦您为整个数组分配了一个全新的值,引用就消失了!

但它只从数组中消失,而不是从函数中消失。它仍然指向那个奇怪的&NULL值。这就是为什么你不能得到任何结果。


推荐阅读