如何在mysqli预处理语句中使用IN子句

时间:2009-04-21 14:42:23

标签: php mysqli sql-in

我正在使用预处理语句将一些旧代码移动到新的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上找不到关于此问题的好文档,那你是如何解决这个问题的呢?

3 个答案:

答案 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)?

归结为:

  • 使用正确数量的问号创建SQL字符串
  • 使用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();