分页使用MySQL LIMIT,OFFSET

 手机用户2502854041 发布于 2023-02-13 08:48

我有一些代码限制数据每页只显示4个项目.我正在使用的列有大约20-30个项目,所以我需要将它们分散在各个页面上.

在第一页,我有:

    $result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4");
{
  echo "";
  echo "";
  echo "" . $row['name'] . "   ";
  echo "" . $row['price'] . "   ";
  echo "";
 }
echo "";

mysqli_close($con);

    ?> 

    
NEXT MAIN MENU

您会注意到页面底部我的锚标记列出了第二页"itempage2.php".在第2项中,我有相同的代码,除了我的select语句列出偏移量4.

$result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4 offset 4");

当我的数据库中有预定数量的项目时,这种方式可行.但它并不那么好.我需要创建一个新页面,只有当有更多的项目,而不是像现在这样硬编码.

如何创建多个页面而无需对每个新页面进行硬编码和偏移?

1 个回答
  • 首先,每个页面没有单独的服务器脚本,这只是疯狂.大多数应用程序通过在URL中使用分页参数来实现分页.就像是:

    http://yoursite.com/itempage.php?page=2
    

    您可以通过访问所请求的页码$_GET['page'].

    这使您的SQL配方非常简单:

    // determine page number from $_GET
    $page = 1;
    if(!empty($_GET['page'])) {
        $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
        if(false === $page) {
            $page = 1;
        }
    }
    
    // set the number of items to display per page
    $items_per_page = 4;
    
    // build query
    $offset = ($page - 1) * $items_per_page;
    $sql = "SELECT * FROM menuitem LIMIT " . $offset . "," . $items_per_page;
    

    因此,例如,如果此处输入page=2为每页4行,则您的查询将为"

    SELECT * FROM menuitem LIMIT 4,4
    

    这就是分页的基本问题.现在,您还需要了解总页数(以便您可以确定是否应显示"下一页",或者是否允许通过链接直接访问页面X).

    为此,您必须了解表中的行数.

    在尝试返回实际的有限记录集之前,您可以使用数据库调用执行此操作(我之前说过,因为您显然希望验证所请求的页面是否存在).

    这实际上非常简单:

    $sql = "SELECT your_primary_key_field FROM menuitem";
    $result = mysqli_query($con, $sql);
    if(false === $result) {
       throw new Exception('Query failed with: ' . mysqli_error());
    } else {
       $row_count = mysqli_num_rows($result);
       // free the result set as you don't need it anymore
       mysqli_free_result($result);
    }
    
    $page_count = 0;
    if (0 === $row_count) {  
        // maybe show some error since there is nothing in your table
    } else {
       // determine page_count
       $page_count = (int)ceil($row_count / $items_per_page);
       // double check that request page is in range
       if($page > $page_count) {
            // error to user, maybe set page to 1
            $page = 1;
       }
    }
    
    // make your LIMIT query here as shown above
    
    
    // later when outputting page, you can simply work with $page and $page_count to output links
    // for example
    for ($i = 1; $i <= $page_count; $i++) {
       if ($i === $page) { // this is current page
           echo 'Page ' . $i . '<br>';
       } else { // show link to other page   
           echo '<a href="/menuitem.php?page=' . $i . '">Page ' . $i . '</a><br>';
       }
    }
    

    2023-02-13 08:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有