我正在使用预处理语句将一些旧代码移动到新的msqli接口,我在使用包含IN子句的SQL语句时遇到问题。我通常会这样做:
$ids = '123,535,345,567,878'
$sql = "SELECT * FROM table WHERE id IN ($ids)";
$res = mysql_query($sql);
将此转换为mysqli和预处理语句我尝试了许多解决方案:
$ids = '123,535,345,567,878'
$ids = implode($ids,',');
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?));
$result->bind_param("i", $ids);
$result->execute();
上述操作失败并计算了数组中元素的数量并改变了SQL字符串中的问号数量,并且对数组中的每个元素调用bind_parm也失败了。仅使用逗号分隔的字符串也会失败。
我在Google上找不到关于此问题的好文档,那你是如何解决这个问题的呢?
答案 0 :(得分:10)
无法将可变长度列表绑定到单个绑定变量。
同样,如果你要绑定字符串$ids
,你实际上最终会得到:
SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878')
(注意ID列表周围的引号)。
使用正确数量的问号和绑定参数创建自己的查询应该已经实际工作 - 您可能需要再次尝试并报告实际错误。
或者,这可能是那些不幸地需要手工制作自己的SQL而不使用绑定参数的场合之一。
答案 1 :(得分:6)
查看之前提到的类似问题的答案(第二个代码示例):
I have an array of integers, how do I use each one in a mysql query (in php)?
归结为:
call_user_func_array()
将数组绑定到查询字符串答案 2 :(得分:-2)
我认为准备好的陈述是这样的,你可以这样做:
$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ? WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'");
foreach ($usernames as $username)
{
$stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username);
$stmt->execute();
}
$stmt->close();