分页使用MySQL LIMIT,OFFSET

我有一些代码,限制数据显示每页只有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"); 

这是有效的,当我的数据库中有预定数量的项目。 但并不是那么好。 我需要创build一个新的页面,只有当有更多的项目,而不是像现在这样硬编码。

如何创build多个页面,而不必硬编码每个新页面,并抵消?

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

因此,例如,如果在这里inputpage=2 ,每页4行,您的查询将是“

 SELECT * FROM menuitem LIMIT 4,4 

所以这是分页的基本问题。 现在,您有要求了解总页数的附加要求(以便您可以确定是否显示“下一页”或者是否允许通过链接直接访问页面X)。

为了做到这一点,你必须了解表中的行数。

在尝试返回实际的有限logging集之前,我们可以简单地使用数据库调用来做到这一点(我之前说过,因为您显然想validation请求的页面是否存在)。

这其实很简单:

 $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>'; } } 

使用.. LIMIT :pageSize OFFSET :pageStart

其中:pageStart绑定到the_page_index(即第一页为0)* number_of_items_per_pages(例如4)和:pageSize绑定到number_of_items_per_pages。

要检测“有更多页面”,请使用SQL_CALC_FOUND_ROWS或使用.. LIMIT :pageSize OFFSET :pageStart + 1并检测最后一个(pageSize + 1)logging丢失。 不用说,对于索引> 0的页面,存在前一页。

如果页面索引值被embedded到URL中(例如,在“prev page”和“next page”链接中),那么可以通过适当的$_GET项目获得。

如果你想保持简单,继续尝试这一点。

 $page_number = mysqli_escape_string($con, $_GET['page']); $count_per_page = 20; $next_offset = $page_number * $count_per_page; $cat =mysqli_query($con, "SELECT * FROM categories LIMIT $count_per_page OFFSET $next_offset"); while ($row = mysqli_fetch_array($cat)) $count = $row[0]; 

其余的由你决定。 如果你有来自两个表的结果,我build议你尝试一个不同的方法。