如何在 mysqli 中为带有 IN 的 SELECT 提供参数

Posted

技术标签:

【中文标题】如何在 mysqli 中为带有 IN 的 SELECT 提供参数【英文标题】:How to deliver params for SELECT with IN in mysqli 【发布时间】:2012-11-12 09:30:17 【问题描述】:

我准备好的查询如下所示:

   $sql = "SELECT $t1.id FROM $t1 WHERE $t1.name IN (?)";

当我尝试时:

   $stmt = Sql::$select->prepare($sql);
   $string="'aaa','bbb','ccc'";
   $stmt->bind_param('s', $string);

...它没有返回预期的结果。它将字符串视为一个名称,而不是多个单独的名称。怎么解决?

函数的其余部分:

   $stmt->execute();
   $stmt->store_result();
   return $stmt;

【问题讨论】:

我之前没有准备好的语句的经验,但是我在使用存储过程时遇到了这个问题。可能您需要在 IN 语句中绑定每个参数。 我想我明白你的意思@KhaleelAKarim,但我做不到 - 字符串中的名称数量未知 什么是Sql?,假设Sql::$select是你的连接对象,那么Sql::$select->error中的消息是什么(准备之后)? duplicate? 有一个similar question 可用,请查看答案。 【参考方案1】:

尝试像这样改变查询

$sql = "SELECT $t1.id FROM $t1 WHERE FIND_IN_SET($t1.name, ?)>0";
$stmt = Sql::$select->prepare($sql);
$string='aaa,bbb,ccc';
$stmt->bind_param('s', $string);

而且这个解决方案并不可靠。 请看 FIND_IN_SET(str,strlist)

正确的方法是对 IN 语句中的每个元素使用单独的占位符。

另一个建议,去掉 IN 语句,在 php 中运行一个循环来生成查询并绑定参数。

【讨论】:

它没有带来结果(仍然将字符串视为一个长名称..)【参考方案2】:

问题是带有 's' 的 bind_param 函数将参数作为单个字符串威胁,因此它基本上是将您的查询转换为:

"SELECT $t1.id FROM $t1 WHERE $t1.name IN (''aaa','bbb','ccc'')";

快速解决方法是将字符串变量更改为:

$string="aaa','bbb','ccc";

注意:没有前导/尾随引号(您可以使用 trim($string, "'")

如果这不起作用,您也可以尝试反转引号:使用 " 而不是 '

一个更可靠和健壮的解决方案是更改查询以包含每个字符串的?(使用带有expolode() / implode() php 函数的数组。

【讨论】:

抱歉,您严重误解了准备好的语句的工作原理。

以上是关于如何在 mysqli 中为带有 IN 的 SELECT 提供参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有数组作为第二个参数的 mysqli::bind_param

带有 SET 变量语句的 Mysqli 查询(在多个查询中)

mysqli使用IN运算符和另一个占位符准备语句

如何在 Django 中为“in”SQL 子句传递值列表

如何在 jpql 中为 in-clause 设置集合项?

带有变量的Mysqli准备好的语句列[重复]