Php 如何在mysqli中为SELECT提供参数

Php 如何在mysqli中为SELECT提供参数,php,sql,mysqli,Php,Sql,Mysqli,我准备的查询如下所示: $sql = "SELECT $t1.id FROM $t1 WHERE $t1.name IN (?)"; 当我尝试时: $stmt = Sql::$select->prepare($sql); $string="'aaa','bbb','ccc'"; $stmt->bind_param('s', $string); …它不会返回预期的结果。它将字符串视为一个名称,而不是多个单独的名称。怎么解决呢? 函数的其余部分: $st

我准备的查询如下所示:

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

尝试这样修改查询

$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);
这种解决方案是不可靠的。 请看

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


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

尝试这样修改查询

$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);
这种解决方案是不可靠的。 请看

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


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

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

"SELECT $t1.id FROM $t1 WHERE $t1.name IN (''aaa','bbb','ccc'')";
快速修复方法是将字符串变量更改为:

$string="aaa','bbb','ccc";
注意:不带前导/尾随引号(您可以使用
trim($string,“”)

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


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

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

"SELECT $t1.id FROM $t1 WHERE $t1.name IN (''aaa','bbb','ccc'')";
快速修复方法是将字符串变量更改为:

$string="aaa','bbb','ccc";
注意:不带前导/尾随引号(您可以使用
trim($string,“”)

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


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

我以前没有编写语句的经验,但我在使用存储过程时遇到过这个问题。可能需要绑定in语句中的每个参数。我想我理解@KhaleelAKarim的意思,但我不能这么做-字符串中的名称数量未知,这是什么,assumi如果
Sql::$select
是您的连接对象,那么
Sql::$select->error
中的消息是什么(在准备之后)?有一个可用的,请查看答案。我以前没有编写语句的经验,但我在使用存储过程时遇到过这个问题。可能您需要绑定in语句中的每个参数。我想我理解您的意思@KhaleelAKarim,但我不能这样做-字符串中的名称数未知e> Sql?,假设
Sql::$select
是您的连接对象,那么
Sql::$select->error
中的消息是什么(在准备之后)?有一个可用的,请查看答案。抱歉,您严重误解了准备语句的工作方式。抱歉,您严重误解了准备语句的工作方式。它不会带来结果(仍然将字符串视为一个长名称…)它不会带来结果(仍然将字符串视为一个长名称…)