PHP MySQL使用IN准备查询


PHP MySQL Prepared Query using IN

我有几种情况下有一个输入数组,例如:

$myArray = array( "apple", "banana", "orange", "pear" );

数组中可以有任意数量的水果。我想在PHP中使用MySQL准备的语句来创建一个类似于的查询

SELECT * FROM fruitcart WHERE fruitname IN ('apple','banana','orange','pear');

以前,我是通过做这样的事情来实现这一点的:

$query = "SELECT * FROM fruitcart WHERE fruitname IN ('" . implode( "','", $myArray ) . "')";

但我想知道是否有办法用事先准备好的陈述来做类似的事情?

使用准备好的语句无法做到这一点。唯一的可能性是这样做:

$query = "SELECT * FROM fruitcart WHERE fruitname = ? OR fruitname = ? OR fruitname = ? ...

您可以使用foreach循环轻松地构建这样的语句。

但请注意,由于您的数组可能具有不同数量的值,这可能会在数据库优化器算法中造成一些混乱。为了获得最佳性能,您可能需要准备具有128、64、32、16、8、4、2、1个插槽的语句,然后使用可以填充的最大插槽,直到从数据库中获得所有值。通过这种方式,优化器能够处理数量有限得多的语句骨架。

您也可以为此使用临时表。例如,创建一个只包含值(apple、banana…)和值集id的表。

然后,您可以使用一个唯一的集合id(例如php提供了一个guid函数)将值数组插入数据库,然后在子查询中选择它们:

$query = "SELECT * FROM fruitcart WHERE fruitname IN (SELECT fruitname FROM temptable WHERE setid = ?)"

这很容易准备,而且会表现得很好。您可以使用内存中的表作为临时表,这样它会非常快。

$placeholders = rtrim(str_repeat('?, ', count($myArray)), ', ') ;
$query = "SELECT * FROM fruitcart WHERE fruitname IN ($placeholders)";
$stm = $db->prepare($query) ;
$stm->execute($myArray) ;

如果使用正确的方法,可以编辑

$list = implode( ',', $myArray );
$query = "SELECT * FROM fruitcart WHERE fruitname IN ('" . $list . "')";

就是这样:)