SELECT查询不适用于使用预准备语句的IN

时间:2018-06-21 22:01:22

标签: 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','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');

(1)。此SELECT查询工作正常:

if ($stmt = $mysqli->prepare("SELECT info FROM items WHERE item_id IN $seller_items AND active = ?")){
$stmt->bind_param("s",$active); 

(2)。此SELECT查询无效:

if ($stmt = $mysqli->prepare("SELECT info FROM items WHERE item_id IN ? AND active = ?")){
$stmt->bind_param("ss",$seller_items,$active);

我认为将变量放入SELECT查询本身可能会破坏准备好的语句的目的。

我可以使IN谓词与未准备好的语句一起正常工作。这是我遇到问题的准备好的声明。

谢谢。

1 个答案:

答案 0 :(得分:1)

正如@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);
相关问题