现在我不得不使用以下结构来处理将多个参数绑定到mysqli查询中:
if ($words_total == 1)
{
$statement -> bind_param("s", $words[0]);
}
else if ($words_total == 2)
{
$statement -> bind_param("ss", $words[0], $words[1]);
}
else if ($words_total == 3)
{
$statement -> bind_param("sss", $words[0], $words[1], $words[2]);
}
//and so on....
我使用下面的代码计算出问号的数量并将其插入我的查询中:
$marks = "";
for($i = 1; $i<=$words_total; $i++) {
if ($i == $words_total)
{
$marks .= "?";
}
else
{
$marks .= "?,";
}
}
我的问题肯定是必须有一种方法来处理我需要动态的查询中的尽可能多的输入。对bind_param()进行硬编码似乎是一种非常糟糕的处理方式。
我使用的是php版本5.4.10
答案 0 :(得分:14)
以下是将可变数量的值绑定到mysqli预处理语句的解决方案或实际问题:
<?php
$values = array('b','c','d');
$in = str_repeat("?,", count($values));
$in = trim($in, ",");
$sql = "SELECT * from users where username in($in)";
$stm = $con->prepare($sql);
$types = str_repeat("s", count($values));
if (strnatcmp(phpversion(),'5.3') >= 0)
{
$bind = array();
foreach($values as $key => $val)
{
$bind[$key] = &$values[$key];
}
} else {
$bind = $values;
}
array_unshift($bind, $types);
call_user_func_array(array($stm, 'bind_param'), $bind);
#var_dump($sql, $types, $bind, $con->error);
$stm->execute();
$res = $stm->get_result();
while($row = $res->fetch_assoc()) var_dump($row);
注释行仅用于开发测试。非常有用。
但您最初的问题是缺少错误报告。
它不仅在这个特殊情况下破坏了你,而且还使用了PHP的整体体验 每当出现问题时,PHP都会告诉你 - 发生了什么以及应该责怪谁。只有你这样做。你永远都应该。
您可以阅读此answer on error reporting basics
在收到错误消息时,您只需谷歌搜索并在几秒钟内找到解决方案。或者至少你会知道,你有什么问题。这实际上是call_user_func_array()
函数的行为,突然改变了。