【问题标题】:CDbCommand->queryAll() does not return all rowsCDbCommand->queryAll() 不返回所有行
【发布时间】:2016-09-23 14:38:17
【问题描述】:
    $connection = Yii::app()->db;
    $command=$connection->createCommand($sqlStatement);
    $rows=$command->queryAll();

我将通过上述代码运行 SQL 与在 MySQL Workbench 中运行相同的 SQL 进行比较。而且,两者返回的行数不同。

MySQL Workbench 正在返回所有行。上面的代码总是返回一个小于总数的数字。

命令的限制是-1。我不确定还有什么要检查的。 Yii 有限制吗?限制行的内存约束? Yii 中的某种缓存?

是否有可能在上述代码之前执行的先前 SQL 语句(放置在一堆 SELECT 语句下游的 .php 脚本中)可能会影响这一点?

我是 Yii 的新手,但不是 SQL 或 MySQL,我很困惑。

【问题讨论】:

  • 显示sql语句
  • SELECT * FROM table1
  • 或我数据库中的任何表
  • 显然,Yii 不是问题所在。使用 mysqli 的代码也返回少于所有行。不确定是否与驱动程序有关。接下来是Wiresharking,但我对php + mysql不太了解,因此希望有任何深入的调试经验。
  • 会不会和mysqli有关? php.net/manual/en/mysqli.store-result.php 其他人在 StackOverflow 上也遇到了这个问题。但是,没有人得到答复。

标签: php yii


【解决方案1】:

这让我得到了答案:Mysql "select * from" doesn't return all rows

事实证明,MySQL 数据库是 ISAM。在对数据库进行一些清理和恢复后,查询开始返回所有行。

【讨论】:

    【解决方案2】:

    Listen queryAll() 返回一个数组,你需要迭代才能得到所有的记录。

    foreach($rows as $row){
      //do something
    }
    

    尝试按部分查询:

    $limit = 1000 ;
    $passes = ceil( Yii::app()->db->createCommand( 'SELECT COUNT(*) FROM{{test_data}}' )->queryScalar() / $limit ) ;
    
    for ( $pass = 0 ; $pass < $passes ; $pass++ ) {
    $command = Yii::app()->db->createCommand()
        ->select('*')
        ->from( '{{test_data}}' )
        ->limit( $limit )
        ->offset( $pass * $limit ) ;
    $result = $command->queryAll() ; // here is your peace of data
    }
    

    【讨论】:

    • 我尝试迭代,但没有成功,因为 num_rows 返回的数字小于表中的总记录数。循环不会超过 num_rows。
    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2015-05-16
    • 2021-07-10
    • 2021-05-19
    • 2016-02-20
    相关资源
    最近更新 更多