【问题标题】:Zend Framework DB Adapter fetchCol problem with "IN"Zend Framework DB Adapter fetchCol 出现“IN”问题
【发布时间】:2011-06-21 13:48:09
【问题描述】:

当使用 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 中的预期行为还是错误?我遇到的主要问题是跟踪不是一个明显的错误,没有功能被破坏,我只是得到的结果更少。

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    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')
    

    【讨论】:

    • 就我为什么只得到一个结果而言,这是有道理的,谢谢!但是,使用数组会引发异常“无效的参数编号:绑定变量的数量与标记的数量不匹配”我假设是因为它期望替换几个?
    • 这对我使用 Zend_Db_Select 有效,但由于您直接调用 fetchCol,您可能需要将您的数组传递到另一个数组中 - 请参阅上面我编辑的答案。
    【解决方案2】:

    试试:

    $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:

    【讨论】:

    • 直接在数据库中运行相同类型的查询,看看你得到了多少结果。
    • 还要检查print_r($idString) 以确保您的数组包含正确的值。
    • 是的,已经尝试了所有这些,除了通过 Db 适配器外,它可以通过各种方式工作
    • 谢谢,以这种方式构建一个 select 语句确实解决了这个问题 - 我不是 Zend_Db_Table_Abstract 的忠实粉丝,尽管我很高兴编写 MySQL 并且我需要做很多连接。
    【解决方案3】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 2012-12-15
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多