【问题标题】:How to correct pagination in oracle?如何纠正oracle中的分页?
【发布时间】:2017-08-17 17:22:16
【问题描述】:

我正在向用户显示他/她接受了多少表格,为此我在 php 中使用了分页。数据从 oracle 数据库中获取并显示在表中。我正在使用分页,但是当我转到下一页时,它显示上一条记录的新记录未显示。

<table>
<tbody>
    <?php
    include('connect.php');
    $user_name = $_SESSION['username'];
    $sql = oci_parse($conn,"select * from userM where user_name = '$user_name'");
    $result = oci_execute($sql);

    while(($row = oci_fetch_array($sql,OCI_BOTH)) != false ){
        $approvedBy = $row[1];
    }
    if(!isset($_GET['page'])){
        $_GET['page'] = 0;
    }else{
        // Convert the page number to an integer
        $_GET['page'] = (int)$_GET['page'];
    }
    $varPage = $_GET['page'];
    if($varPage == "" || $varPage == "1"){
        $page1 = 0;
    }else{
        $page1 = ($varPage*6)-6;
    }
    $approvedBy = strtoupper($approvedBy);

    $sql = oci_parse($conn,"SELECT * FROM formC where UPPER(approvedBy) = '$approvedBy' AND rownum < 7");
    oci_execute($sql);

    while(($row = oci_fetch_array($sql,OCI_BOTH)) != false )  {
        $accountingNo = $row[0];
        ?>
        <tr>
            <td style="color:black"><?php echo  $row[0] ?></td>
            <td style="color:black"><?php echo  $row[1] ?></td>
            <td style="color:black"><?php echo  $row[2]  ?></td>
            <td style="color:black"><?php echo $row[3]?></td>
            <td style="color:black"><?php echo $row[4] ?></td>
            <td style="color:black"><?php echo $row[7] ?></td>         
        </tr>
        <?php 
    }
    ?>
</tbody>
</table>

<?php
$sql1 = oci_parse($conn,"SELECT * FROM formC where UPPER(approvedBy) = '$approvedBy'");
oci_execute($sql1);
$count = oci_fetch_all($sql1,$abc);
$a=$count/6;
$a = ceil($a);

for($b=1;$b<=$a;$b++){
    ?>
    <a href="approvedList.php?page=<?php echo $b?>" style="text-decoration;align:center: none;" class="btn btn-success "><?php echo $b." "; ?></a>
    <?php
}
oci_close($conn);
?>
</div> 

【问题讨论】:

    标签: php oracle pagination


    【解决方案1】:

    这在The Underground PHP and Oracle Manual,第 181 页中进行了解释:

    Oracle8i 及更高版本的规范分页查询在http://asktom.oracle.com 上给出:

    select *
      from ( select a.*, rownum as rnum
             from (YOUR_QUERY_GOES_HERE -- including the order by) a
             where rownum <= MAX_ROW )
      where rnum >= MIN_ROW
    

    这里,MIN_ROW 是行号 第一行,MAX_ROW 是要返回的最后一行的行号。

    甚至还有一个完整的示例脚本:

    <?php
    $c = oci_connect('hr', 'welcome', 'localhost/XE');
    $mystmt = "select city from locations order by city";
    $minrow = 4; // row number of first row to return
    $maxrow = 8; // row number of last row to return
    $pagesql = "select *
                from ( select a.*, rownum as rnum
                       from ( $mystmt ) a
                       where rownum <= :maxrow)
                where rnum >= :minrow";
    $s = oci_parse($c, $pagesql);
    oci_bind_by_name($s, ":maxrow", $maxrow);
    oci_bind_by_name($s, ":minrow", $minrow);
    oci_execute($s);
    oci_fetch_all($s, $res);
    var_dump($res);
    ?>
    

    编辑:

    作为mentioned by Christopher Jones,在Oracle >=12.1 中,使用offset clause 有一种更简洁的方法:

    select *
    from mytable
    order by myfield
    offset X rows fetch next Y rows only
    

    【讨论】:

    • 感谢您的帮助
    • 使用 Oracle DB 12,您现在可以使用 OFFSET / FETCH NEXT,请参阅 docs.oracle.com/database/122/SQLRF/… 这使 SQL 更好,并且不会返回额外的 rownum 列
    • @ChristopherJones 谢谢,这非常有用!我们什么时候可以期待更新的手册? ;-)
    【解决方案2】:

    我不是预言家,但我不建议您选择所有行并计算它们,我认为最好使用此代码来计算行数:

    $sql1 = oci_parse($conn,"SELECT COUNT(*) FROM formC where UPPER(approvedBy) = '$approvedBy'");
        oci_execute($sql1);
    $count = oci_fetch_all($sql1,$abc);
    $a=$count/6;
    

    oracle count documentation

    要解决您的问题,请参阅此问题:How do I limit the number of rows returned by an Oracle query after ordering?

    您计算当前页面并将其保存在$page1,但没有在您的查询中使用它!!

    【讨论】:

    • @NidaAkram 我没有测试它,从文档中找到正确的查询
    • 我已阅读文档并根据该问题完成的是它显示错误未定义索引行
    猜你喜欢
    • 2017-12-23
    • 2015-02-25
    • 1970-01-01
    • 2019-10-09
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多