最近利用adodb库做分页处理,其中返回记录总数使用了_adodb_getcount函数,但我发现返回的结果和真正结果不一样,原因是我在分页查询语句里使用了limit限制最多的记录数,但在_adodb_getcount函数中有这样的处理
if (isset($rewritesql) && $rewritesql != $sql) {
if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0];
 var_dump($rewritesql);
if ($secs2cache) {
// we only use half the time of secs2cache because the count can quickly
// become inaccurate if new records are added
$qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr);

} else {
$qryRecs = $zthis->GetOne($rewritesql,$inputarr);
   }
if ($qryRecs !== false) return $qryRecs;
}他把limit从我的sql语句里拆出来了,最终变成了下面这种形式。
SELECT COUNT(*) FROM ( 被他重新组织的sql ) _ADODB_ALIAS_ limit xx
COUNT(*)这样的语句应该只会返回一条记录,他把我的limit拆出来放到外面,导致我的limit不起作用,而且这个limit对这个COUNT(*)也毫无用处,不知道这个是bug还是我的用法错误?而且由于我的sql语句中带有limit,导致翻页代码出错。我的数据库是postgresql,翻页调用了SelectLimit函数,这个函数在我的sql后边拼接了limit和offset,导致最终sql中出现两个limit所以出错。不知道这个算不算bug。我现在的处理是把_adodb_getcount中的那段给注释掉,然后在SelectLimit中把我原有的limit语句截掉。不知道我这样改会不会给其他查询带来影响。如果按他原有的方式,我的分页查询中就不能出现limit和offset,但实际上我经常需要限制分页查询内容的总数,比如超过1000条记录就不列出来了。也许这个是bug。不知道高人们如何看?
 

解决方案 »

  1.   

    如果你打算自己拼 SQL 取得记录数
    应该使用 $db->GetOne($sql);_adodb_getcount是内部用的
      

  2.   

    我没有直接用_adodb_getcount,我是用的PageExecute函数做分页查询。
    我现在把_adodb_getcount中
    if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0];
    给移到
    $rewritesql = adodb_strip_order_by($sql);
    下面了,
    然后SelectLimit中把我原有的limit语句合并了,目前没发现问题,其他查询也都正常,所以我认为这是BUG