【问题标题】:PHP pagination with single sql query带有单个 sql 查询的 PHP 分页
【发布时间】:2018-08-18 19:49:10
【问题描述】:

我正在尝试使用单个 php sql 查询来存档分页,因为我觉得运行 select 语句两次太多了,因为我想对我的数据进行分页我已经尝试了查询功能 (*)count

我尝试设置一个限制,如果 number_of_rows 等于我的限制,我会自动分页这适用于两页,但我无法确定第三页,所以它不是一个好方法。

我正在考虑的另一种方法是获取所有数据,然后使用 java 脚本进行分页,但我不知道该怎么做,所以我尝试用 php 来做,但想学习如何用 java 脚本来做如果可能的话。

我只想运行一个查询并分页感谢您的帮助

这是我的代码:

   <?php
    //count rows in table
    $query= "SELECT * FROM $database.$table WHERE `id` <> '$id'";
    $result= mysqli_query($conn, ($query));

    $results_per_page =30;

    //calculate total pages
    if($result)
    {
        $num_row = mysqli_num_rows($result);
        mysqli_free_result($result);
        $total_pages = ceil($num_row / $results_per_page);
    }   

    //to get page value
    if(isset($_GET["page"])){ 
        $page =$_GET["page"]; 
    } else{ 
        $page=1; 
    };
    $start_from = ($page-1) * $results_per_page;
    $start_from_here = mysqli_real_escape_string($conn, stripslashes($start_from));
    $start_from_here = filter_var($start_from_here, FILTER_SANITIZE_NUMBER_INT );

    //get data to display
    $query1= " SELECT * FROM $database.$table 
                WHERE `id` <> '$id' 
                ORDER BY type ASC 
                LIMIT $results_per_page OFFSET $start_from_here  ";
    $result1= mysqli_query($conn, ($query1));

而我的html分页代码就是这样

<?php
    if(isset($total_pages) && ($total_pages>1)) {   
        $url="http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $url=strtok($url, '?');

        for ($i=1; $i<=$total_pages; $i++) {   
        //Print links for all pages
            echo "<a class='pagination' href='".$url."?page=".$i."'>".$i."</a>";
        }
    }
    ?>

感谢大家的帮助

【问题讨论】:

  • 您目前的方法到底有什么问题?
  • @Sayra,看。除非您正在缓存从数据库中获取的结果(我没有看到发生这种情况),否则每次将看到的每个页面都会执行相同的查询。鉴于此,如果您仍想使用基于完整结果的分页,我将编写一个示例。这是你想要表演的吗? (考虑到您可能拥有的行数,这可能会极大地影响它的性能)
  • 是的,我只是想要获得行数和分页的最佳方法,而不必两次查询表
  • 我在做或找到一种解决方案之间,结果发现这个很棒,请检查一下:stackoverflow.com/questions/3705318/…
  • 是的,你查询了两次,但是FOUND_ROWS()的查询很简单,不需要访问表数据。

标签: javascript php html pagination


【解决方案1】:

由于您的第一个查询只查找行数,您可以通过选择行数来优化它。

$query= "SELECT COUNT(*) FROM $database.$table WHERE `id` <> '$id'";

这样 SQL 服务器将只返回行数,而不是匹配的行数。

编辑

您还可以加载整个数据并将其存储在会话变量中。这样,您只需加载一次数据,就可以显示相关部分而无需再次查询。

【讨论】:

  • 是的,我已经尝试过了,但也希望能够对数据进行分页,否则我最终将显示所有数据一次
  • 如果我这样做,我无法分页,我仍然必须使用第二个查询来限制和偏移数据,或者我应该只获取所有数据和行数,然后在我的回显数据的循环?
  • 但这会破坏一次不抓取整个数据的目的,例如如果表有 1000 行呢?
  • 虽然计数是一个非常好的改进,但这并不能真正回答所提出的问题。
  • @Rafael 但是“一次阅读所有内容”部分确实回答了“单个 sql 查询”问题。
【解决方案2】:

不可能在一个查询中同时执行这两项操作。您可以通过执行以下操作来优化聚合

SELECT COUNT(1) AS row_count
FROM database.table_name
WHERE `id` <> YOUR_ID_HERE

然后您可以使用 row_count 变量来进行所有关于总页数和限制的计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 2020-05-14
    • 2012-09-01
    • 2013-07-28
    • 2014-02-27
    • 2015-03-28
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多