当前位置: 首页 > 面试题库 >

使用MySQL LIMIT,OFFSET的分页

姚骁
2023-03-14
问题内容

我有一些限制数据以每页仅显示4个项目的代码。我使用的列大约有20到30个项目,因此我需要将这些项目分散在各个页面上。

在第一页上,我有:

    $result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4");
{
  echo "<tr>";
  echo "<td align='center'><img src=\"" . $row['picturepath'] . "\" /></td>";
  echo "<td align='center'>" . $row['name'] . "</td> <td align='center'> <input type='button' value='More Info'; onclick=\"window.location='more_info.php?';\"> </td>";
  echo "<td align='center'>" . $row['price'] . "</td> <td align='center'> <input type='button' value='Add to Order' onclick=''> </td>";
  echo "</tr>";
 }
echo "</table>";

mysqli_close($con);

    ?>

    <table width="1024" align="center" >
        <tr height="50"></tr>
            <tr>
                <td width="80%" align="right">
                    <a href="itempage2.php">NEXT</a>
                </td>
                <td width="20%" align="right">
                    <a href="">MAIN MENU</a>
                </td>
            </tr>
    </table>

您会在页面底部注意到我的定位标记,其中列出了第二个页面“
itempage2.php”。在项目页面2中,我具有相同的代码,除了我的select语句列出了偏移量4。

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

当我的数据库中有预定数量的项目时,这种方式可以运行。但这不是很好。仅当有更多项目时才需要创建一个新页面,而不是像现在这样将其硬编码到其中。

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


问题答案:

首先,不要为每个页面使用单独的服务器脚本,这只是疯狂。大多数应用程序通过使用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

因此,这是分页的基本问题。现在,您有了附加的要求,即您希望了解页面的总数(以便可以确定是否应显示“ NEXT
PAGE”,还是要允许通过链接直接访问页面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>';
   }
}


 类似资料:
  • 本文向大家介绍分页使用MySQL LIMIT,OFFSET吗?,包括了分页使用MySQL LIMIT,OFFSET吗?的使用技巧和注意事项,需要的朋友参考一下 首先,我们需要创建一个包含一些记录的表,然后在限制和偏移量的帮助下使用分页。 借助CREATE命令创建表。查询如下- 创建表后,我们将在INSERT命令的帮助下插入记录。 插入记录 插入记录后,我们可以借助SELECT命令检查表中有多少条记

  • 问题内容: 我正在开发Java Web服务,当从IBM中型机(AS400)上的DB2数据库中获取大数据集时,允许分页。 例如; 如果数据集中有10000条记录,我想一次以1000个块的形式获取它们。 我发现这篇文章解释说我可以使用LIMIT和OFFSET。但是我需要将变量设置为。 现在,我一直在谷歌搜索,看到您可以使用来设置此变量。但是我无法找出在哪里键入此命令? 我正在Windows机器上进行开

  • 描述 (Description) offset( )方法获取第一个匹配元素相对于文档的当前偏移offset( )以像素为单位)。 返回的对象包含两个Float属性,top和left。 浏览器通常将这些值舍入到最接近的整数像素以进行实际定位。 该方法仅适用于可见元素。 语法 (Syntax) 以下是使用此方法的简单语法 - <i>selector</i>.offset( ) 参数 (Paramet

  • 我正在考虑将我们传统的jpa/道解决方案迁移到Spring Data。 但是,我们的前端之一是SmartGWT,它们的数据库组件仅使用限制/偏移逐步加载数据,这使得难以使用Pagable。 这会导致问题,因为无法确定限制/偏移量最终是否可以转换为页码。(这可能因用户滚动方式、屏幕大小等而异)。 我查看了切片等,但无法找到在任何地方使用限制/偏移值的方法。 想知道有没有人有什么建议?最理想的情况是,

  • 本文向大家介绍Jquery中offset()和position()的区别分析,包括了Jquery中offset()和position()的区别分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了Jquery中offset()和position()的区别。分享给大家供大家参考。具体分析如下: 一、Jquery中offset() 获取匹配元素在当前视口的相对偏移。 总是计算相对于文档的位置,无

  • 描述 (Description) marker-offset属性定义marker-offset的最近边界边缘与其关联的主框之间的距离。 不幸的是,IE 6或Netscape 7不支持此属性。 可能的值 (Possible Values) length - 任何长度值。 auto - 默认,让浏览器自动设置它。 适用于 (Applies to) 所有元素都带有标记显示。 DOM语法 (DOM Syn