【问题标题】:PHP/MySQL Pagination with one queryPHP/MySQL 一次查询分页
【发布时间】:2020-08-28 13:41:30
【问题描述】:

我现在的分页方式如下:

===============
首先,我进行正常查询,然后返回所有结果。

然后我计算结果,假设是 300。我用 num_results 来做这个

现在我检查用户想要什么页面,以及限制,比如说 30,10。

最后我执行新查询,并选择了限制。

================

使用这种方法我做了两次几乎相同的查询,没有其他方法可以做到这一点,只需一次。

【问题讨论】:

    标签: php mysql pagination


    【解决方案1】:

    是的,您可以将SQL_CALC_FOUND_ROWS 用于此目的。

    select SQL_CALC_FOUND_ROWS something from table limit 30,10

    这样你仍然可以获得不使用限制子句时正常检索的行数。

    【讨论】:

    • 哇,我会试试这个!
    • @Dennis Haarbrink:我认为这可能会导致鸡和蛋的情况。如果需要行数来计算要显示的分页集(例如 30 页,每页有 10 个项目),则必须首先返回行数。此时,用户可以选择要查看的页面。使用SQL_CALC_FOUND_ROWS 意味着在用户选择要查看的页面之后返回行数。
    • @Mike:我假设每页的项目数是“常数”,并且您可以与总行数一起确定页数。所以假设你想要第 3 页,偏移量变为$num_pages * $records_per_page
    • @Dennis Haarbrink:我的想法是,在获得总页数之前,您不能询问用户他们想查看哪一页。因此,要显示页数,您必须从数据库中获取行数并计算页数。然后您询问用户他们想要哪个页面,然后返回该页面的数据库。
    • @Mike:嗯,通常你会向用户展示第一页,然后让用户选择去哪里。因此,您的“基本”偏移量将始终为零。
    【解决方案2】:

    我通过一个查询使用以下类似的方法解决了它 - 你得到 limit x,y+1 所以一个额外的项目在 limit 中并用 array_slice 询问它 - 如果它是空的,就没有更多的项目了。

     <?php
    /*
    CREATE TABLE test ( f1 varchar(23), f2 varchar(23) );
    INSERT INTO test  VALUES( 'one','testfdsfsdf');
    INSERT INTO test  VALUES( 'two','ssasfsdff');
    INSERT INTO test  VALUES( 'three','wewefferwr');
    INSERT INTO test  VALUES( 'four','wer3rtetet');
    INSERT INTO test  VALUES( 'five','sdfsfsdffsdf');
    INSERT INTO test  VALUES( 'six','sdasdadasd');
    INSERT INTO test  VALUES( 'seven','testfdsfsdf');
    INSERT INTO test  VALUES( 'eight','ssasfsdff');
    INSERT INTO test  VALUES( 'nine','wewefferwr');
    
    */
    
    
    $servername     = "localhost";
    $username       = "root";
    $password       = "";
    $dbname         = "eztrades";
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
    }
    
    $start=2;
    $items_per_page = 3;
    $n=$items_per_page+1;
    $sql = "SELECT * FROM  TEST LIMIT ".$start.','.$n;
    $result = $conn->query($sql);
    print_r( $result);
    
    while( $r  = $result->fetch_assoc()) {
            print_r( $r);
            $last_item = array_slice( $r , $items_per_page +1, 1 );
    }
    echo 'LAST ITEM::::';
    print_r( $last_item );
    if(empty($last_item)) {
        echo 'NO MORE ITEMS';
    }
    
    
    ?> 
    

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多