Php Db2从范围中选择

Php Db2从范围中选择,php,pagination,db2,range,ibm-midrange,Php,Pagination,Db2,Range,Ibm Midrange,我被要求在我的工作中修复一个php函数。原型是: function select($cols, $table, $cond, $order, $start, $max); 它使用odbc\u exec查询数据库,并返回具有odbc\u num\u行的行数。函数代码如下所示: $this->query = "SELECT $cols FROM $table "; if($cond) $this->query .= "WHERE $cond"; if($order) $this->

我被要求在我的工作中修复一个php函数。原型是:

function select($cols, $table, $cond, $order, $start, $max);
它使用odbc\u exec查询数据库,并返回具有odbc\u num\u行的行数。函数代码如下所示:

$this->query = "SELECT $cols FROM $table ";
if($cond) $this->query .= "WHERE $cond";
if($order) $this->query .= " ORDER BY ".$order;
SELECT $cols FROM 
    ( SELECT ROW_NUMBER() OVER() AS rownum, $convertedCols ) AS tmp
WHERE rownum > $start AND rownum <= $max
这个函数在很多地方使用,所以我不能从头开始编写。它从许多表中获取记录。直到昨天,它还没有使用$max变量,所以它从数据库中读取所有记录。他们正在使用iSeries Access ODBC驱动程序。我看了看答案,但找不到

我想使用$start变量,从$start开始读取,并读取$max行。如果$start是100,而$max是50,我希望得到100-150之间的记录。我昨天补充了这一部分:

if($max) $this->query .= " FETCH FIRST " . $max . " ROWS ONLY ";
我找不到任何对我的问题有用的东西。我知道我可以用id或类似的东西为一张桌子做这件事。但我正在寻找一个通用的解决方案。

也许这会有帮助:

我解决了这个问题

首先,需要使用php将$cols中的每个列名转换为$table.columnName

$this->query .= " ( SELECT ROW_NUMBER() OVER() AS rownum, $convertedColumns
                       FROM $table ) AS tmp WHERE rownum > ". $start ." " ;
if($max) {
    $last = $start + $max;
    $this->query .= " AND rownum <= ". $last . " ";
}
结果查询如下所示:

$this->query = "SELECT $cols FROM $table ";
if($cond) $this->query .= "WHERE $cond";
if($order) $this->query .= " ORDER BY ".$order;
SELECT $cols FROM 
    ( SELECT ROW_NUMBER() OVER() AS rownum, $convertedCols ) AS tmp
WHERE rownum > $start AND rownum <= $max

谢谢,但不幸的是,它使用的列名顺序超过了COL1。我可能不会一直得到列名。他们只能使用*。相对记录号RRNlibrary.tablename会有帮助吗?这更像是记录被输入到表中的顺序……您是否在根据查询的排序顺序查找记录100-150?行号函数调用中缺少order BY子句可能会为任何试图一次滚动一页结果的进程带来不可预测的结果。即使使用ORDER BY生成一致的排序结果,使用此方法的滚动读卡器仍然无法避免其他连接发送的插入、更新和删除可能导致的意外间隙。我应该更改它吗?他们还没有把代码放到服务器上。如果连订单都会引起问题,我应该这样接受吗?好问题。分页服务是否可以接受取决于应用程序在迭代多页结果时对不一致性的容忍度。底层模式向程序员承诺了一个非常方便的契约,让我选择任何东西,甚至*,您总是可以得到一个方便的逐页结果列表,而无需在结果集上保持直接光标,甚至无需维护有状态的数据库连接,但它是通过做出一些权衡来实现的,这可能会也应该让程序员感到震惊。