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

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

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

推荐答案

首先,不要 for each 页面单独设置服务器脚本,这太疯狂了.大多数应用程序通过在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页).

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

在try 返回实际的有限记录集之前,只需使用DB调用就可以实现这一点(我之前说过,因为您显然希望验证请求的页面是否存在).

这其实很简单:

$sql = "SELECT your_primary_key_field FROM menuitem";
$result = mysqli_query($con, $sql);
$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相关问答推荐

无法从容器从APS. NET应用程序连接到MySQL服务器容器

SQL MaxSum查询为列 Select 了不正确的值

将上传文件的存储路径放在一张表中的缺点是什么?

发生的原因及解决方法

替代对多个表执行 FULL OUTER JOIN?

如何在Mysql中使用With和Values

从 MySQL 8.0.12 升级到 8.0.32 时出错

MySQL Procedure 变量在 count(*) 上接收 null

SQL使用LIMIT获取结果和结果中的行数

基于关系的每个实体有一个真值和多个假值

MYSQL:如何根据之前的相关记录获取记录

在一个 SQL 查询中对同一列中相同类型的不同值求和

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

查询以查找可用时隙

如何在 MySQL 中删除具有 2 列作为复合主键的多行?

从一个带有连接的表中删除

如何在 python 中逐行获取 MySQL ResultSet

在 WHERE 子句中使用 mysql concat()?

为什么 MySQL 自动增量会在插入失败时增加?

ON UPDATE RESTRICT 有什么作用?