【问题标题】:Dynamically generating mysqli bind_param for "WHERE IN" statements using php 5.3+使用 php 5.3+ 为“WHERE IN”语句动态生成 mysqli bind_param
【发布时间】:2014-08-21 02:31:05
【问题描述】:

这个问题依赖于answer about using call_user_func_array 来动态生成 bind_param 语句,以及 php 手册中关于必须将引用的项目传递给 bind_param 语句的a user posting。但是,仍然存在一个问题:

PHP 警告:mysqli_stmt::bind_param(): 变量数不 匹配准备好的语句中的参数个数

代码如下:

$error_id_list = implode(',', array_fill(0, count($error_ids), '?'));
$type=""; for ($i=0; $i<count($error_ids); $i++){$type .= "i";}
$query = "SELECT `id`, `question`, `multi_1`, `multi_2`, `multi_3`, `multi_4` FROM `student_exam` WHERE `id` IN ('".$error_id_list."') ORDER BY RAND() LIMIT 0, 5";
$result = $mysqli->prepare($query);
if($result === FALSE)
    die($result->error);
array_unshift($error_ids, $type);
call_user_func_array(array($result, 'bind_param'), refValues($error_ids));
$result->execute();
$result->store_result();
$result->bind_result($id,$question,$multi1,$multi2,$multi3,$multi4);

while($result->fetch()){
    $output;
}
$result->free_result();

return $output;

谢谢!

【问题讨论】:

  • 由于您没有显示您正在构建的查询字符串的外观或构建方式,因此我们无法真正帮助您。但很明显,? 参数与您尝试绑定到它们的变量不匹配。
  • 对不起@MarcB,我会马上发布的
  • 我可以看到这会变得混乱,您将如何设法为绑定参数分配正确的类型?我确定并非所有字段都是整数。最好放弃这个想法?
  • 在这种情况下,所有变量总是整数。

标签: php mysqli prepared-statement


【解决方案1】:

错误是微不足道的,SQL 语句中的问号不需要用引号括起来(尽管 StackOverflow 上的其他几个答案确实使用引号)。

$error_id_list = implode(',', array_fill(0, count($error_ids), '?'));
$type=""; for ($i=0; $i<count($error_ids); $i++){$type .= "i";}
$query = "SELECT `id`, `question`, `multi_1`, `multi_2`, `multi_3`, `multi_4` FROM 
  `student_exam` WHERE `id` IN ('".$error_id_list."') ORDER BY RAND() LIMIT 0, 5";
                                ^^--- no quotes --^^
$result = $mysqli->prepare($query);
if($result === FALSE)
    die($result->error);
array_unshift($error_ids, $type);
call_user_func_array(array($result, 'bind_param'), refValues($error_ids));
$result->execute();
$result->store_result();
$result->bind_result($id,$question,$multi1,$multi2,$multi3,$multi4);

while($result->fetch()){
    $output;
}
$result->free_result();

return $output;

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2018-04-28
    • 2011-10-25
    • 2012-12-24
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多