2017-04-16 63 views
2

我一直在尝试将阵列与准备好的语句绑定数天,我设法创建了?,?i,i这些数字代表我的代码为$params$type。当我使用call_user_func_array与我的代码,因为我没有设法使它工作,我已经尝试了多个来自这个网站的答案,但我没有得到它的工作。PHP:使用Call_User_Func和绑定参数的“预期值为参考”

完整的查询代码:

$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

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

只是现在有了一个烂摊子比较这整洁的代码。

+0

是的,它更干净。需要哪个版本才能完成这项工作? –

+0

*任何*支持的版本。目前支持的最新版本是5.6。 –

-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)); 
+0

嗨,你能给我提供一个这个函数的例子吗?我不明白这个函数里面的绑定是怎么样的。 –

+0

我刚刚编辑你的案件和解释。 –

+0

替换你的行'call_user_func_array(array($ stmt11,“bind_param”),array_merge(array($ type),$ greaterThan));'与那些并且看看它是否工作 –