2013-04-26 46 views
0

我正在與CI分頁助手與我的SQL 2008分貝。代碼點火器分頁與SQL Server 2008

凡我對模型的功能是:

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

我想你得到的理由更多,更多記錄是_limit()正在添加要在查詢中使用的偏移量和限制。因此,當你瀏覽它們時,你的頁面正在查詢SELECT TOP 10,SELECT TOP 20,SELECT TOP 30等。我沒有足夠的SQL Server 2008經驗來了解如何正確地進行抵消。 – Samutz 2013-04-26 23:19:32

回答

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; 
} 

發佈者yangh這裏:http://ellislab.com/forums/viewthread/160626/