Val*_*tal 29 php 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>
Run Code Online (Sandbox Code Playgroud)
您会注意到页面底部我的锚标记列出了第二页"itempage2.php".在第2项中,我有相同的代码,除了我的select语句列出偏移量4.
$result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4 offset 4");
Run Code Online (Sandbox Code Playgroud)
当我的数据库中有预定数量的项目时,这种方式可行.但它并不那么好.我需要创建一个新页面,只有当有更多的项目,而不是像现在这样硬编码.
如何创建多个页面而无需对每个新页面进行硬编码和偏移?
Mik*_*ant 82
首先,每个页面没有单独的服务器脚本,这只是疯狂.大多数应用程序通过在URL中使用分页参数来实现分页.就像是:
http://yoursite.com/itempage.php?page=2
Run Code Online (Sandbox Code Playgroud)
您可以通过访问所请求的页码$_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;
Run Code Online (Sandbox Code Playgroud)
因此,例如,如果此处输入page=2为每页4行,则您的查询将为"
SELECT * FROM menuitem LIMIT 4,4
Run Code Online (Sandbox Code Playgroud)
这就是分页的基本问题.现在,您还需要了解总页数(以便您可以确定是否应显示"下一页",或者是否允许通过链接直接访问页面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>';
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您想保持简单,请继续尝试。
$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];
Run Code Online (Sandbox Code Playgroud)
剩下的就看你了。如果您有来自两个表的结果,我建议您尝试不同的方法。
| 归档时间: |
|
| 查看次数: |
112444 次 |
| 最近记录: |