【问题标题】:How do you use IN clauses with mysqli prepared statements [duplicate]如何在 mysqli 准备好的语句中使用 IN 子句 [重复]
【发布时间】:2010-10-20 20:24:24
【问题描述】:

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

【问题讨论】:

    标签: php mysqli sql-in


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      I have an array of integers, how do I use each one in a mysql query (in php)?

      归结为:

      • 创建带有适量问号的 SQL 字符串
      • 使用call_user_func_array() 将您的数组绑定到查询字符串

      【讨论】:

      • all_user_func_array() 成功了谢谢
      • 您指的是答案,但链接指向问题。您可以使用答案下方的“分享”链接的 URL 直接链接到答案。
      • @Majid 我知道。一般来说,我发现首先将焦点放在问题上更有帮助,这样读者就可以确定其他线程与他们自己的问题的关系。
      【解决方案3】:

      我认为准备好的语句的意义在于,在这种情况下你可以这样做:

      $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();
      

      【讨论】:

      • 你的回答更像是一个我相信的问题。问题还在于,在 IN 语句中,它会将多个 in 值作为一个字符串转义。
      猜你喜欢
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 2015-03-16
      • 2012-03-26
      相关资源
      最近更新 更多