|
本帖最后由 lihao812 于 2009-10-13 10:02 编辑
坛子查了N编了,郁闷就是找不到怎么解决 MSSQL LINIT的问题.
于是自己改写了limit函数.代码如下:
PHP复制代码 function _limit ($sql, $limit, $offset)
{
$TableWhere = strstr($sql,'FROM ');
if($limit >=$offset){
return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$offset.' ', $sql.'AND ID>(SELECT MAX(ID) FROM(SELECT TOP '.$limit.' ID '.$TableWhere.') AST )');
}
else{
return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$offset.' ', $sql);
}
} 复制代码
不好用拍我砖,我很菜的!
---------------------------------------------------------
修正一下,上面的修改limit是可以暂时解决问题,但是后来发现
$this->db->order_by('ID DESC');
不能用了,几经周折,终于找到方法了.但不支持ASC DESC同时使用. -_-!~~望高手指点!
在mssql_driver.php增加变量
var $RSnum = '0';//这个值是结果总数.分页调用的时候给赋值,
$this->db->RSnum = $config['total_rows'];//记录总数.
PHP复制代码
function _limit ($sql, $limit, $offset)
{
//$i = $limit + $offset;
return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$offset.' ', $sql);
}
复制代码
在DB_active_rec.php增加了个自定义函数:
PHP复制代码
//函数功能:处理MSSQL的 limit 参数.
function _mssqlLimitStr ($sql){
if($this->dbdriver == 'mssql'){
$TableWhere = strstr($sql,'FROM ');
if($this->ar_limit >= $this->ar_offset){
$MaxID = $this->ar_limit;
if(stristr(implode(', ', $this->ar_orderby),'DESC') =='DESC'){
$Select = '<=';$MaxID = $this->RSnum-$this->ar_limit;
}
else if($this->ar_limit == $this->ar_offset)$Select = '>'; else $Select = '>=';
$Temp=' AND ID'.$Select.'(SELECT MAX(ID) FROM(SELECT TOP '.$MaxID.' ID '.$TableWhere.') AST )';
return $Temp;
}
}
}
复制代码
修改 order_by 处理sql 的地方(大概在1582行):
PHP复制代码
// Write the "ORDER BY" portion of the query
if (count($this->ar_orderby) > 0)
{
$sql .= $this->_mssqlLimitStr ($sql);
$sql .= "\\nORDER BY ";
$sql .= implode(', ', $this->ar_orderby);
if ($this->ar_order !== FALSE)
{
$sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC';
}
}
复制代码
这样就完美支持 ORDER BY了. 其他的AR功能还没测试.先放出来分享了. |
评分
-
查看全部评分
|