我一直在尝试使用准备好的语句将数组绑定数天,我已设法创建?,?
的数量,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)
}
答案 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)
尝试将该表达式分配给变量,然后绑定变量。表达式不能用作引用,因此您必须传递变量。