Php 选择“使用准备好的语句中不使用的查询”

Php 选择“使用准备好的语句中不使用的查询”,php,mysql,prepared-statement,Php,Mysql,Prepared Statement,有人能帮我找到SELECT查询2吗。在下面工作 此字符串用于两个SELECT语句: $seller_items = ('6','9','12','13','14','15','16','17','18','19','20','22','23','24','25','26','28','27','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49

有人能帮我找到SELECT查询2吗。在下面工作

此字符串用于两个SELECT语句:

$seller_items = ('6','9','12','13','14','15','16','17','18','19','20','22','23','24','25','26','28','27','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','53','54','55','57','58','59','60','62','63','64','65','61','67','56','69','70','74','73','75','78','80','76','72','95','94','101','102','71','103','2','104','4','81','21','10','11','3','79','5','8','7','97','93','96','98');
一,。此选择查询工作正常:

if ($stmt = $mysqli->prepare("SELECT info FROM items WHERE item_id IN $seller_items AND active = ?")){
$stmt->bind_param("s",$active); 
二,。此选择查询不起作用:

if ($stmt = $mysqli->prepare("SELECT info FROM items WHERE item_id IN ? AND active = ?")){
$stmt->bind_param("ss",$seller_items,$active);
我认为将变量放在SELECT查询本身可能会破坏预先准备好的语句的目的

我可以让IN谓词与未准备好的语句配合使用。我有问题的是事先准备好的陈述


提前谢谢。

如@Dai所述,in不能仅用一个变量进行参数化。当然,可以用一系列参数来完成,但是参数的数量是固定的。prepare语句的思想是,插入的值应该是相同的位置、相同数量的参数和相同的类型

如果IN中的参数量是固定的,则类似于这样的操作:

$a=[1,2,3];
$s=$mysqli->prepare("SELECT id FROM users WHERE role_id IN (?,?,?)");
$s->bind_param('iii',$a[0],$a[1],$a[2]);
$s->execute();
$s->bind_result($id);
$c=[];
while($s->fetch()){
  $c[]=$id;
}
var_dump($c);
也许这不是您想要的答案,但是如果不知道变量的数量,最好在原始SQL命令中插入内爆的数组字符串

$a=[1,2,3];
$b="('".implode("','",$a)."')";
$s=$mysqli->prepare("SELECT id FROM users WHERE role_id IN {$b}");
$s->execute();
$s->bind_result($id);
$c=[];
while($s->fetch()){
  $c[]=$id;
}
var_dump($c);

不能在SQL中参数化IN运算符。在MSSQL中,参数化值数组的方法是将其作为表值参数传递,并与之进行联接。我想MySQL也有类似的功能。否则,请创建并插入一个临时表。可能是@Dai的重复项-谢谢您提供的信息。我很感激@迈克-谢谢你的信息和链接。我很感激一个选项是拥有大量预定义的占位符,并将NULL放入未使用的占位符中。我假设MySQL查询预处理器将对此进行优化,例如,WHERE foo IN?、?、?、?、?、?、?、?、?、?、?、?、?、?、->WHERE foo IN 1,2,3,4、NULL、NULL、NULL、NULL、NULL、NULL等都可以工作。然而,bind_参数也变得很难实现,它需要一堆虚拟变量。@Carlos H.-你帮我省去了很多麻烦。谢谢另外一个问题可以吗?{$b}工作得很好。该方法是否会妨碍SELECT查询的安全性?@Harvey这完全取决于如何捕获和清理这些值,以避免包含单引号的情况。如果他们有,例如爱尔兰姓氏,他们需要被转义。如果它们是确定的,那么数字应该不是问题。实际上,无论用户是否准备报表,开发人员都会尽职尽责地清理用户的输入。