【问题标题】:Yii CSqlDataProvider() and MSSQL - last page bugYii CSqlDataProvider() 和 MSSQL - 最后一页错误
【发布时间】:2015-04-05 17:47:23
【问题描述】:

我正在使用 Yii 1.1.16 和 CSqlDataProvider()CGridView 中显示数据。当转到最后一页时,我得到最后一个 PageSize 计数记录,而不是最后一页上的记录数。例如,我有 12 条记录的网格,PageSize 设置为 10,这意味着我有 2 页,所以在第 1 页,我从 1 到 10 获取记录,但在第 2 页(最后一页)我得到记录 3 - 12!

这是我在每一页上得到的值

//on page 1
$dataProvider->getPagination()->getPageCount(); //2
$dataProvider->getPagination()->currentPage; //0
$dataProvider->getPagination()->offset; //0

//on page 2
$dataProvider->getPagination()->getPageCount(); //2
$dataProvider->getPagination()->currentPage; //1
$dataProvider->getPagination()->offset; //10

如您所见,这是我应该在页面上获得的值,显示的数据应该是正确的,但不是。

我故意写了 Yii 版本,因为这是在 Yii 从 1.1.8 升级之前工作的

还有一件事,我正在使用 MSSQL (Microsoft SQL) 数据库来提供数据

【问题讨论】:

    标签: php sql-server yii cgridview csqldataprovider


    【解决方案1】:

    似乎这是Yii framework issueMSSQL,这是解决方案之一,覆盖CSqlDataProvider

    class MSSqlDataProvider extends CSqlDataProvider
    {
    
        /**
         * Fetches the data from the persistent data storage.
         * @return array list of data items
         */
        protected function fetchData()
        {
            $sql = $this->sql;
            $db = $this->db === null ? Yii::app()->db : $this->db;
            $db->active = true;
    
            if (($sort = $this->getSort()) !== false) {
                $order = $sort->getOrderBy();
                if (!empty($order)) {
                    if (preg_match('/\s+order\s+by\s+[\w\s,]+$/i', $sql))
                        $sql.=', ' . $order;
                    else
                        $sql.=' ORDER BY ' . $order;
                }
            }
    
            if (($pagination = $this->getPagination()) !== false) {
                $pagination->setItemCount($this->getTotalItemCount());
                $limit = $pagination->getLimit();
                $offset = $pagination->getOffset();
    
                // update limit to the correct value for the last page 
                if ($offset + $limit > $pagination->getItemCount())
                    $limit = $pagination->getItemCount() - $offset;
    
                $sql = $db->getCommandBuilder()->applyLimit($sql, $limit, $offset);
            }
    
            $command = $db->createCommand($sql);
            foreach ($this->params as $name => $value)
                $command->bindValue($name, $value);
    
            return $command->queryAll();
        }
    
    }
    

    感谢this 发帖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      相关资源
      最近更新 更多