0

我有几种输入数组的情况,例如:

$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 ) . "')";

但我想知道是否有办法用准备好的语句做类似的事情?

4

3 回答 3

1

没有办法使用准备好的语句来做到这一点。唯一的可能性是做这样的事情:

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

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

但请注意,由于您的数组可能有不同数量的值,这可能会导致数据库优化器算法出现一些混乱。为了获得最佳性能,您可能需要准备具有例如 128、64、32、16、8、4、2、1 个插槽的语句,然后使用您可以填充的最大一个,直到您从数据库中获取所有值。这样,优化器就能够处理数量有限的语句框架。

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

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

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

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

于 2012-07-19T06:50:12.550 回答
0
$placeholders = rtrim(str_repeat('?, ', count($myArray)), ', ') ;
$query = "SELECT * FROM fruitcart WHERE fruitname IN ($placeholders)";

$stm = $db->prepare($query) ;
$stm->execute($myArray) ;
于 2012-07-19T06:53:31.883 回答
-2

您正在使用正确的方法来做到这一点,您可以编辑

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

就是这样 :)

于 2012-07-19T06:38:42.207 回答