如何使用Zend_Db_Adapter_Mysqli :: fetchAll()中的“IN”WHERE子句进行查询?

问题描述:

我遇到了一个奇怪的问题Zend_Db_Adapter_Mysqli。我需要从我的数据库通过ID查询多个项目,所以我有以下SQL,如何使用Zend_Db_Adapter_Mysqli :: fetchAll()中的“IN”WHERE子句进行查询?

SELECT * FROM mytable WHERE id IN (1,2,3) 

此查询正常工作。

然后我试着和Zend_Db_Adapter_Mysqli做到这一点编程,

$sql = 'SELECT * FROM mytable WHERE id IN (?)'; 
$ids = array(1,2,3); 
$result = $adapter->fetchAll($sql, implode(',', $ids)); 

的问题是上述PHP我只拿回1分的结果,而不是预期的3。我已经试过刚好路过$ids代替使用implode(),但我只是得到一个错误。

我在做什么错?

+1

这听起来像一个愚蠢的问题,但是否有实际上行与IDS 1,2,3你的数据库? :) – 2011-01-07 10:09:03

+0

@Spiny Normal:是的。 – 2011-01-07 10:21:08

我不知道是否有帮助,但这里有一个如何使用Zend_Db_Select对象做一个答案:How to create WHERE IN clause with Zend_Db_Select

编辑:

好吧,如果真的不行,而你打算使用一个字符串,无论如何,你就不能做到这一点:

$ids = array(1,2,3); 
$sql = sprintf('SELECT * FROM mytable WHERE id IN (%s)', implode(',' $ids)); 
$result = $adapter->fetchAll($sql); 

:)

或者甚至更好:

$ids = array(1,2,3); 
$sql = sprintf('SELECT * FROM mytable WHERE id IN (%s)', implode(',' array_fill('?', count($ids))); 
$result = $adapter->fetchAll($sql, $ids); 

但是,我不确定fetchAll会接受这个。

+0

我看到了,但是我们不能使用它,因为我们使用了“SELECT SQL_CACHE”,而你无法使用Zend_Db_Select。 – 2011-01-07 10:22:18

不那么容易。在这里看到: http://forums.mysql.com/read.php?45,64588,66133#msg-66133

事实上,你只有一个结果是由于MySQL解释字符串'1,2,3'1。你会明确地有三个问号添加到查询:

$ids = array(1,2,3); 
$sql = 'SELECT * FROM mytable WHERE id IN (?, ?, ?)'; 
$result = $adapter->fetchAll($sql, $ids); 

你可以写,将改变$ids以问号权数的函数。

看到这个问题/答案的方式使用带有参数化语句的IN子句。

I have an array of integers, how do I use each one in a mysql query (in php)?