Php Zend Paginator在查询包含“0”时显示错误的页数;独特的;

Php Zend Paginator在查询包含“0”时显示错误的页数;独特的;,php,mysql,zend-framework,zend-paginator,Php,Mysql,Zend Framework,Zend Paginator,我在一个项目中使用了ZF1.10,在此之前,我一直非常成功地将Zend_Paginator与Zend_DbTable查询结合使用 查询需要一个DISTINCT关键字来删除由联接创建的重复行,但是当我添加它时,分页器错误地显示两页结果的导航,而实际上只有一页结果。仔细研究发现,它正在执行两个查询,一个查询我要查找的结果集(77行),另一个查询获取计数。但是Zend magic生成的第二个查询不包含DISTINCT关键字,因此计数返回112行而不是77行 这是相关的一点 $select = $thi

我在一个项目中使用了ZF1.10,在此之前,我一直非常成功地将Zend_Paginator与Zend_DbTable查询结合使用

查询需要一个DISTINCT关键字来删除由联接创建的重复行,但是当我添加它时,分页器错误地显示两页结果的导航,而实际上只有一页结果。仔细研究发现,它正在执行两个查询,一个查询我要查找的结果集(77行),另一个查询获取计数。但是Zend magic生成的第二个查询不包含DISTINCT关键字,因此计数返回112行而不是77行

这是相关的一点

$select = $this->select()
    ->setIntegrityCheck(false)
    ->from('companies')
    ->distinct()
    ->join('project_team', 'companies.companyID = project_team.companyID', null)
    ->join('project_team_roles', 'project_team.roleID = project_team_roles.roleID', null)
    ->join('projects', 'projects.projectID = project_team.projectID', null)
    ->where('project_team_roles.isArchitect')
    ->where('companies.companyName LIKE ?', '%' . $str . '%')
    ->where('projects.islive AND NOT projects.isDeleted')
    ->order('companies.companyName'); 
 $adapter = new Zend_Paginator_Adapter_DbTableSelect($select);
 $paginator = new Zend_Paginator($adapter);
 $paginator->setCurrentPageNumber($page);
 $paginator->setItemCountPerPage(100);
 return $paginator;
它生成的查询没有问题,只是忽略了count查询中的DISTINCT子句。如果删除->distinct()位,则所有结果都非常好-112行,分页都是超级的,除了数据有重复的行

我看到关于类似问题的错误报告回溯了很久,但在早期版本的ZF中它们被标记为已修复

这是一个已知的陷阱吗?我能做些什么而不用自己写页码吗。并不是说编写分页特别具有挑战性,但这意味着这一点将与项目的其余部分不一致

非常感谢

伊恩


编辑-找到了一个变通方法,发布为下面的答案。

找到了一个简单的变通方法。。。不要使用DbTable适配器,而是将结果放入数组中,然后将其传递给分页器

$results = $this->fetchAll($select)->toArray(); 
$adapter = new Zend_Paginator_Adapter_Array($results);
看起来只有DbTable有这个bug


祝你好运

这是很久以前提出的问题,但它仍然需要一个答案

您应该在控制器中使用setRowCount()方法

$select = $your_model->getSelect();
$select_count = $your_model->getCount(); // geting count from select above
$adapter = new Zend_Paginator_Adapter_DbSelect($select);
$adapter->setRowCount((int)trim($select_count)); // <-- // set integer !
$paginator = new Zend_Paginator($adapter);
// That's it
...

$this->view->paginator = $paginator; 
// and so on...
$select=$your_model->getSelect();
$select_count=$your_model->getCount();//从上面的选择中获取计数
$adapter=new Zend_Paginator_adapter_DbSelect($select);

$adapter->setRowCount((int)trim($select_count));//然后,您将检索所有结果并将它们存储在一个数组中,效率不高-谢谢-下次我更新此项目时,我将尝试此方法。为了不厌其烦地回答这样一个老问题,请首先更新ZF,如果这不能解决问题,那么您可以执行命令:grep-r-l“paginator”*以查找代码是什么,并对其进行更改。。。或设置ZFDebug以记录查询所在的位置。。。但无论如何,你必须改变代码