【问题标题】:PHP best way to display x results per pagePHP每页显示x个结果的最佳方式
【发布时间】:2020-12-11 20:47:49
【问题描述】:

我有一个包含许多条目的数据库,其中也包含日期时间字段。 现在索引是一个 md5 哈希值,它是从包括日期在内的其他字段中计算出来的,使每个条目都是唯一的。

假设这个数据库中每页显示 50 个结果的最佳方式是什么?你能提供一个php的例子吗?

我可能看不到这一点,但如果我使用整数 ID 字段作为唯一键(自动递增),这会容易得多,因为这样我可以查询最后一个 ID,如 9412 并执行 -50 到获取第一页的最后 50 个结果,然后在用户单击箭头时执行 -50 以获取第二页上的前 50 个结果。

唯一的问题是我会替换到这个数据库中以避免哈希重复条目。如果 ID 是一个自动递增的整数,这可能不起作用。

谢谢。

【问题讨论】:

  • 你知道分页吗...?
  • 另外,你确定你的算法保证唯一性吗?
  • 我敢肯定,至少对我来说足够独特。在检查了这个之后:phpeasystep.com/phptu/29.html 基本上依赖于 mysql LIMIT 在我按日期对表格进行排序之后,如果不查看 id、日期或任何其他表格属性,那是否可以正常工作?

标签: php mysql


【解决方案1】:

正如其他人所提到的,我也建议使用LIMIT, OFFSET

我在很多网站上都看到过这种方法:

用户点击例如第 5 页并被重定向到

-> view.php?p=5

在 PHP 文件中有这样的内容:

$page = $_GET['p'];
$limit = 50;

$page = ($page - 1) * $limit;

$sql = "SELECT * FROM Posts LIMIT ".$limit." OFFSET ".$page." ORDER BY ID";
. . . 

2020 年编辑: 我只是不小心重新发现了我的答案,如果你想走这条路,请使用prepared statements保护自己免受SQL Injection attacks的伤害

【讨论】:

  • 我认为$page = ($page - 1) * $limit; 会更有意义,因为视图中的页码是从 1 开始的,而在 DB 中,偏移量是从 0 开始的。
【解决方案2】:

我不确定您的哈希值,但使用 GUID(全局唯一 ID)比自动增量整数 id 值有几个优势。 GUID 主键非常适合许多开发场景,例如复制,或者当您需要在数据库之外生成主键时。

关于分页,您需要找到定义数据自然顺序的字段或字段组合。例如。您可以使用日期字段。然后你可以使用这个命令来实现带有 LIMIT 和 OFFSET 关键字的分页。这是您获得第一页的方式:

select * from table
order by date_field desc -- show most recent records on top
limit 10 offset 0;

这是您获得第二页的方式:

select * from table
order by date_field desc -- show most recent records on top
limit 10 offset 10;

这是您获得第 N 页的方式:

select * from table
order by date_field desc
limit 10 offset 10*N;

【讨论】:

    【解决方案3】:

    如果您允许删除行,就分页/排序而言,整数自动递增 ID 与您的计算相结合并不是一个好的解决方案。从表中删除行的“硬”删除和具有 isActive 列的“软”删除(如果值设置为非活动)会阻止显示行,这都会弄乱您的计算。具有某些 id 的行将丢失,这意味着您的结果集有时会少于 50 行,或者会显示不应该查看的非活动行。您可以在 MySQL 查询中使用“LIMIT”。

    LIMIT 子句可用于限制 SELECT 语句返回的行数。 LIMIT 接受一个或两个数字参数,它们都必须是非负整数常量(使用准备好的语句时除外)。

    有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为0(不是1):

    SELECT * FROM tbl LIMIT 5,10; # 检索第 6-15 行

    http://dev.mysql.com/doc/refman/5.0/en/select.html

    将它与分页结合起来,你就有了一个很好的解决方案。

    至于排序,这取决于您何时更新日期行。如果日期列是不可变的,则使用 LIMIT 结合按日期排序将确保一致的表示,否则表示将随着日期列的变化而随时间变化,但它仍然有效(您将获得 50 行并且它们都将是可见的活动行)。

    如果您的日期列是可更改的(例如,它反映了上次登录信息),但您希望确保记录以相同的方式排序(相同的 50 条记录始终显示在第一页等)并且您可以负担得起要添加列,您可以添加不可变整数自增列以进行排序,但保留主键列,因为它方便您

    【讨论】:

      【解决方案4】:

      您不必担心 ID。在 SQL 中使用 LIMITOFFSET

      SELECT * FROM tbl
      ORDER BY f_date DESC
      LIMIT 50 OFFSET 0
      

      将是您搜索结果的第一页。您可以增加偏移量以获取其他页面,例如第二页是OFFSET 50

      要获取有关该主题的更多信息,请使用 Google 并搜索分页。

      【讨论】:

      • 我错过了这个答案的重要一点:您需要在查询中应用 order by 子句才能按 limit n, offset m 对结果进行分页。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多