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详解

php函数: call_user_func()和call_user_func_array() 使用详解

PHP函数详解:call_user_func()使用方法

PHP 中 call_user_func 的使用

PHP 中 call_user_func 的使用

PHP函数详解:call_user_func()使用方法