使用“IN”的Zend Framework数据库适配器fetchCol问题

时间:2011-06-21 13:48:09

标签: php zend-framework

使用Zend_Db_Adapter类的fetchCol方法进行选择时,查询无法正常工作,例如:(其中$ db是对DB_Adapter的引用)

$ids = array(1,2,3,4);
$idString = implode(",", $ids);
$query = "SELECT id FROM some_table WHERE id IN (?)";
$result = $db->fetchCol($query, $idString);

你希望这会返回一个与idString匹配的id数组,但它只返回一个带有单个项的数组 - 第一个匹配的id。如果我像这样重写它就没有问题:

$ids = array(1,2,3,4);
$idString = implode(",", $ids);
$query = "SELECT id FROM some_table WHERE id IN ($idString)";
$result = $db->fetchCol($query);

预期的行为或ZF中的错误?我遇到的主要问题是跟踪不是一个明显的错误,没有功能被破坏我只有更少的结果。

3 个答案:

答案 0 :(得分:3)

ZF很聪明,知道如何使用数组,所以你需要的只是传入数组本身,跳过内爆:

$query = "SELECT id FROM some_table WHERE id IN (?)";
$result = $db->fetchCol($query, array($ids));

使用您的代码,因为您传入的字符串会被引用,因此您运行的查询最终会是这样的:

SELECT id FROM some_table WHERE id IN ('1, 2, 3, 4')

答案 1 :(得分:1)

尝试:

$query = "SELECT id FROM some_table WHERE id IN (?)";
$result = $db->fetchAll($query, $idString);

为'sometable'创建一个DbTable

class SomeTable extends Zend_Db_Table_Abstract {
  protected $_name = 'sometable';
}

像这样获取结果

$table = new SomeTable();
$select = $table->select();
$select->where('id IN (?)',  $idString );
$result = $table->fetchAll( $select );

请参阅以下POST:

答案 2 :(得分:0)

试试这个:

$ids    = array( 1, 2, 3 );
$db->fetchCol( 'SELECT id FROM some_table WHERE id IN (' . str_repeat( '?,', sizeof( $ids )-1 ) . '?)', $ids );

你可以这样做:

$db->fetchCol( 'SELECT id FROM some_table WHERE id IN (' . $db->quoteInto( '?', $ids ) . ')' );