使用IN的PHP MySQL准备查询

时间:2012-07-19 06:34:23

标签: php mysql sql mysqli prepared-statement

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

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

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

3 个答案:

答案 0 :(得分: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 = ?)"

这很容易准备,并且表现相当不错。 您可以使用内存表来获取临时表,这样会非常快。

答案 1 :(得分:0)

$placeholders = rtrim(str_repeat('?, ', count($myArray)), ', ') ;
$query = "SELECT * FROM fruitcart WHERE fruitname IN ($placeholders)";

$stm = $db->prepare($query) ;
$stm->execute($myArray) ;

答案 2 :(得分:-2)

您正在使用正确的方法执行此操作,您可以编辑

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

就是这样:))

相关问题