如果通过数组索引传递参数,为什么php准备好的语句不起作用?

时间:2019-05-19 16:13:32

标签: php mysqli prepared-statement bindparam

为什么这不返回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();

2 个答案:

答案 0 :(得分:1)

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;,那么它就会起作用。
但是您为整个数组分配了全新的价值。结果,它现在不包含引用,而是一个新值。

以上可以用simple code snippet

进行说明。

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

但是它仅从数组中消失,而没有从函数中消失。那里仍然指向那个奇数&NULL。这就是为什么您无法获得任何结果的原因。

答案 1 :(得分:-2)

在评论中分享了我的想法

$sql = $conn -> prepare("select * from table where id = ?");
$sql -> bind_param('i', $array[0]);// undefined since $array is not yet defined
$array = array(1);// you've just defined it here
$sql -> execute();
$sql = $conn -> prepare("select * from table where id = ?");
$array = array(1);// you have defined it first
$sql -> bind_param('i', $array[0]);// PHP will know $array, since you've defined it in the row above
$sql -> execute();

希望这会有所帮助!

如果有不清楚的地方,请告诉我!