PHP:使用Call_User_Func和Bind Params

时间:2017-04-16 05:55:57

标签: php arrays mysqli

我一直在尝试使用准备好的语句将数组绑定数天,我已设法创建?,?的数量,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)
}

3 个答案:

答案 0 :(得分:1)

如果你的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);

将这个简洁的代码与你现在可怕的混乱进行比较。

答案 1 :(得分:0)

我有一个方法,我在一个课程中使用我以一种时髦的方式工作mysqli。密钥驻留在foreach循环中:Basicaly您通过引用创建另一个数组的副本,然后绑定引用的数组。希望这会有所帮助。

更新: 在你的情况下,你需要创建一个包含字符串$ type和greateThan数组的数组。从临时数组到绑定数组,确保密钥保持不变,并且在调用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));

答案 2 :(得分:-1)

尝试将该表达式分配给变量,然后绑定变量。表达式不能用作引用,因此您必须传递变量。