PHP:带有 Call_User_Func 和 Bind Params 的“期望值作为参考”
Posted
技术标签:
【中文标题】PHP:带有 Call_User_Func 和 Bind Params 的“期望值作为参考”【英文标题】:PHP: "Value Expected To Be A Reference" with Call_User_Func and Bind Params 【发布时间】:2017-09-12 01:12:52 【问题描述】:几天来,我一直在尝试将数组与准备好的语句绑定,我设法创建了 ?,?
和 i,i
的数量,这些在我的代码中表示为 $params
和 $type
。将 call_user_func_array 与我的代码一起使用时会出现问题,因为我没有设法让它工作,我已经尝试了这个网站的多个答案,但我没有让它工作。
完整查询代码为:
$params = implode(',', array_fill(0, count($greaterThan), '?'));
$stmt11 = $mysqli->prepare("SELECT nombre FROM usuarios WHERE id IN (".$params.")");
$type = implode('', array_fill(0, count($greaterThan), 'i'));
$param = implode(",", $greaterThan);
call_user_func_array(array($stmt11, "bind_param"), array_merge(array($type), $greaterThan));
print_r(error_get_last());
$stmt11->execute();
$stmt11->store_result();
$stmt11->bind_result($nombresmayores);
$arraynombresmayores = array();
$stmt11->store_result();
while($stmt11->fetch())
$arraynombresmayores[] = $nombresmayores;
$param
是用逗号分隔的值(以备不时之需)。我要绑定的数组是$greaterThan
,查询工作完美,因为我做了一些调试。程序输出的错误是:
Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given
最后,数组的内容是:
array(2)
[0]=>
int(2)
[1]=>
int(4)
【问题讨论】:
【参考方案1】:只需尝试将该表达式分配给一个变量,然后绑定一个变量。表达式不能用作引用,所以你必须传递一个变量。
【讨论】:
【参考方案2】:我在一个类中使用了一种方法,我用一种时髦的方式来工作 mysqli。关键在于 foreach 循环:基本上,您通过引用创建一个数组的副本,然后绑定引用的数组。希望这会有所帮助。
更新: 在您的情况下,您需要使用您的字符串 $type 和 GreateThan 数组创建一个数组。从 temp 到 bind 数组,确保键保持不变,并且在调用 bond_param 之前不要取消设置数据
$type = implode('', array_fill(0, count($greaterThan), 'i'));
//$param = implode(",", $greaterThan); //Not needed
//merge the 'type' as an array and the variables to pass
$temp_params= array_merge([$type],$greaterThan);
//Create a referenced array but dont'reference the 'type' argument
foreach($temp_params as $k=>$v)
if($k===0)
$bind_params[$k]=$temp_params[$k];
else
$bind_params[$k]=&$temp_params[$k];
//use the referenced array
call_user_func_array(array($stmt11, "bind_param"), array_merge(array($type), $bind_params));
【讨论】:
您好,您能提供一个使用此功能的示例吗?我不明白函数内部的绑定如何。 我刚刚为您的案例进行了编辑并进行了解释。 用这些替换你的call_user_func_array(array($stmt11, "bind_param"), array_merge(array($type), $greaterThan));
,看看它是否有效
哦等等。我看到一些破旧的东西
这里,更简单且不言自明:)【参考方案3】:
如果你的 php 版本没有过时,你可以让它变得更简单
$params = implode(',', array_fill(0, count($greaterThan), '?'));
$stmt = $mysqli->prepare("SELECT nombre FROM usuarios WHERE id IN ($params)");
$types = str_repeat('i',count($greaterThan));
$stmt->bind_param($types, ...$greaterThan);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($nombresmayores);
$arraynombresmayores = array();
$stmt->store_result();
while($stmt->fetch())
$arraynombresmayores[] = $nombresmayores;
但更好use PDO:
$params = implode(',', array_fill(0, count($greaterThan), '?'));
$stmt = $pdo->prepare("SELECT nombre FROM usuarios WHERE id IN ($params)");
$stmt->execute($greaterThan);
$arraynombresmayores = $stmt->fetchAll(PDO::FETCH_COLUMN);
只需将这段简洁的代码与你现在拥有的糟糕的代码进行比较。
【讨论】:
是的,它更干净。需要哪个版本才能使其正常工作? 任何支持的版本。目前支持的最后一个版本是 5.6。以上是关于PHP:带有 Call_User_Func 和 Bind Params 的“期望值作为参考”的主要内容,如果未能解决你的问题,请参考以下文章
php自定义函数call_user_func和call_user_func_array详解