2

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

   $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;
4

2 回答 2

0

尝试像这样更改查询

$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 中运行一个循环来生成查询并绑定参数。

于 2012-11-12T10:10:20.083 回答
-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 函数的数组)。

于 2012-11-12T10:19:15.727 回答