13

我正在使用准备好的语句将一些旧代码移动到新的 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 也失败。仅使用逗号分隔的字符串也会失败。

我在谷歌上找不到关于这方面的好文档,那么你是如何解决这个问题的?

4

3 回答 3

11

不可能将可变长度列表绑定到单个绑定变量。

同样,如果您要绑定字符串$ids,您实际上会得到:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878')

(注意 ID 列表周围的引号)。

使用正确数量的问号和绑定参数创建自己的查询应该确实有效 - 您可能需要再次尝试并报告实际错误。

或者,这可能是不幸需要手工制作自己的 SQL 并且不使用绑定参数的情况之一。

于 2009-04-21T14:45:01.953 回答
5

查看之前在此处提出的类似问题的答案(第二个代码示例):

我有一个整数数组,如何在 mysql 查询(在 php 中)中使用每个整数?

它归结为:

  • 创建带有适量问号的 SQL 字符串
  • 用于call_user_func_array()将数组绑定到查询字符串
于 2009-04-21T14:51:00.537 回答
-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();
于 2013-05-14T23:04:07.720 回答