如何在 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