【问题标题】:PHP: "Value Expected To Be A Reference" with Call_User_Func and Bind ParamsPHP:带有 Call_User_Func 和 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)
}

【问题讨论】:

    标签: php arrays mysqli


    【解决方案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。
      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2016-03-10
      • 2015-05-29
      • 2013-07-05
      相关资源
      最近更新 更多