我正在使用CI分页助手和我的sql 2008 db。
我在模型上的功能是:
function get_data($limit, $offset) {
$billing_db = $this -> load -> database('billing', TRUE);
$billing_db -> select('stuff, stuff2, stuff3');
$billing_db -> from('mytable');
$billing_db -> limit($limit, $offset);
$this -> db -> order_by("id", "asc");
$q = $billing_db -> get();
return $q;
}
现在在我的控制器上我调用了这样的函数:
$data['billers'] = $this -> billing_model -> get_data(10, $this -> uri -> segment(3));
当我在默认情况下打开页面时,它会正确显示10个条目。
然后问题在我更改页面时开始,让我说我点击下一步。
现在url段3是10.它应该从第10个条目开始并且限制为10.
但最新发生的是它从第1项开始并显示20条记录 每次偏移量越高,它就会从开始时开始显示更多记录。
可能出现什么问题?
/**
* Limit string
*
* Generates a platform-specific LIMIT clause
*
* @access public
* @param string the sql query string
* @param integer the number of rows to limit the query to
* @param integer the offset value
* @return string
*/
function _limit($sql, $limit, $offset)
{
$i = $limit + $offset;
return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);
}
答案 0 :(得分:4)
sqlsrv_driver和mssql_driver中的_limit函数无法正常使用偏移量。我相信一旦CI 3发布,这将得到解决,但到目前为止,我发现的最佳解决方案是:
function _limit($sql, $limit, $offset)
{
if (count($this->ar_orderby) > 0)
{
$OrderBy = "ORDER BY ";
$OrderBy .= implode(', ', $this->ar_orderby);
if ($this->ar_order !== FALSE)
{
$OrderBy .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC';
}
}
$sql = preg_replace('/(\\'. $OrderBy .'\n?)/i','', $sql);
$sql = preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 row_number() OVER ('.$OrderBy.') AS rownum, ', $sql);
$NewSQL = "SELECT * \nFROM (\n" . $sql . ") AS A \nWHERE A.rownum BETWEEN (" .($offset + 1) . ") AND (".($offset + $limit).")";
return $NewSQL;
}