Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用sql server 2008进行代码点火器分页_Php_Sql_Codeigniter_Limit - Fatal编程技术网

Php 使用sql server 2008进行代码点火器分页

Php 使用sql server 2008进行代码点火器分页,php,sql,codeigniter,limit,Php,Sql,Codeigniter,Limit,我正在使用sql 2008 db使用CI分页助手 其中,我在模型上的功能是: function get_data($limit, $offset) { $billing_db = $this -> load -> database('billing', TRUE); $billing_db -> select('stuff, stuff2, stuff3'); $billing_db -> from('mytable'); $billin

我正在使用sql 2008 db使用CI分页助手

其中,我在模型上的功能是:

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

sqlsrv_驱动程序和mssql_驱动程序中的_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在这里发布:

sqlsrv\u驱动程序和mssql\u驱动程序中的_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在这里发布:

我想你得到越来越多记录的原因是_limit()正在添加要在查询中使用的偏移量和限制。因此,您的页面在浏览时会查询选择前10名、选择前20名、选择前30名等等。不过,我没有足够的SQL Server 2008经验,不知道如何正确地进行偏移。我想,您获得越来越多记录的原因是_limit()正在添加要在查询中使用的偏移量和限制。因此,您的页面在浏览时会查询选择前10名、选择前20名、选择前30名等等。不过,我没有足够的SQL Server 2008经验,不知道如何正确地进行偏移。