Zend Fetch在大表10,000 +行,~100列

时间:2012-05-29 09:31:19

标签: php zend-framework zend-db-table

我有一个sql视图,它返回超过10,000条记录,大约有120列(荒谬,我知道)。

使用Zend_Db_Table_Abstract对象从PHP中的数据库收集视图数据。我们有一个报告控制器,它执行fetchAll(显然创建一个大型数组)并将数组存储在视图对象中。接下来我们有一个视图脚本,它遍历数组并回显一个json格式的数组。

这很慢。比如超过1分钟来呈现此报告,我该怎么做才能加快速度呢?

请记住,我对这个项目很新,并且不了解Zend和PHP。此外,由于数据保护等原因,我无法放弃。

如果你可以问你需要什么来帮助你收集那些很棒的图片。但基本上这就是脚本的作用:

报告控制器:

Setup some basic json report data (for data tables)
$this->view->report_data = fetchALL($oSelect);

查看脚本:

Output the basic json stuff, then:
"report_data": [
<?php 
    for($i = 0; $i < count($this->report_data); $i++){
        echo "[";
        foreach($this->columns as $k=>$col){
            echo '"'. $this->escape($this->report_data[$i][$col]) .'"';
            if($k < count($this->columns) -1 ){
                echo ',';
            }
        }
        echo "]";
        if($i < count($this->report_data) -1){
            echo ",";
        }
        echo"\n";
    }
?> ]

因此在做了一些研究之后我收集到了我可以使用fetch()而不是fetchAll()来一次获得1行,以避免大量数组。但是我尝试使用fetch()并得到了这个错误:

调用未定义的方法Zend_Db_Table_Abstract::fetch()

所以现在我很沮丧。

我的想法是获取每一行并输出Json格式化的每一行,但是我真的不知道如何在报表控制器/视图场景中执行此操作。我是否必须摆脱视图脚本并只使用控制器输出数据?

无论如何为什么fetch()不起作用,我实际上也无法在文档中看到它,还有一些数组function _fetch()

如果您需要更多信息,我们将不胜感激。 感谢

3 个答案:

答案 0 :(得分:0)

请参阅fetch()的文档。

以下不是很优雅,但可以帮到你:

型号:

...
function getResults()
{
    return $db->query('SELECT * FROM bugs');
}
...

控制器:

...
$this->view->report_data = $model->getResults();
...

查看:

...
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
    echo Zend_Json::encode($row);
}
...

我没有测试过代码,但你应该明白这个想法。

答案 1 :(得分:0)

你必须在这里即兴使用框架来获得额外的性能

在控制器中

$this->view->result = mysql_query($sql);

在视图中

while ($row = mysql_fetch_assoc($this->result)) {
 echo json_encode($row);
}

注意设置mysql过程接口读取 http://php.net/manual/en/function.mysql-fetch-assoc.php

答案 2 :(得分:0)

正如您从错误消息中了解到的,Zend_Db_Table_Abstract没有fetch()方法。但是,它有一个具有此签名的fetchRow()方法: -

/**
 * Fetches one row in an object of type Zend_Db_Table_Row_Abstract,
 * or returns null if no row matches the specified criteria.
 *
 * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
 * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
 * @param int                               $offset OPTIONAL An SQL OFFSET value.
 * @return Zend_Db_Table_Row_Abstract|null The row results per the
 *     Zend_Db_Adapter fetch mode, or null if no row found.
 */
public function fetchRow($where = null, $order = null, $offset = null)

所以用fetchRow()替换fetch()并在!null === fetchRow()时循环应该适合你。

总是值得深入研究Zend Framework的代码,看看提供什么。

Zend Paginator也可能是您的选项,因为它只是获取呈现页面所需的记录。