[英]Pagination of MySQL results in PHP
直到最近,我才真正将这个(分页)视为一个问题。 当我坐下来并注意它时,我发现自己面临着许多问题。
我所涉及的是基本联系人管理系统,其中用户可以添加/更新/删除/搜索联系人。 搜索部分是我需要有效实施分页的地方。
我有什么想法(+ ve和-ve点)
POST
到search.php
页面时指定pageNo
和offset
。 此页面将触发一个简单的MySQL查询以检索结果。 由于行数几乎可以运行数千,我需要对其进行分页。 很简单,但我需要为每个不同的页面反复激活相同的查询。 这意味着,当用户从page1转到page2时,将触发相同的MySQL查询(当然具有不同的offset
),这是我认为多余的,并且我试图避免。 $_SESSION
,但在这种情况下,如果结果是巨大的呢? 它会以任何方式影响性能吗? 我的问题:
A。 我实现了上述哪种方法? 哪一个更好? 还有其他方法吗? 我用谷歌搜索了它,但我发现大多数例子都在上面的第1点。
B。 我对point1的疑问:我们如何依赖mysql结果的顺序? 假设用户在一段时间后导航到page2,我们怎么能确定,在第二次,第一页的记录没有重复? (因为,我们正在做一个新的查询)..
C. MySQL资源究竟是什么? 我知道mysql_query(..)
返回一个resource
。 从某种意义上说它是否是全局的,它维护着对PHP脚本的不同调用之间的状态? (我可以在$_SESSION
维护资源)。
太感谢了! :-)
PS:我知道这是一个很长的问题。 我只是试图以简洁的方式说明我脑子里到处都是。
使用你的第一个建议。 有偏移的那个。 这是分页的“标准”方式。 将整个结果集放入会话将是一个坏主意,因为每个用户都有自己的数据私有副本。 如果遇到性能问题,可以随时添加缓存(memcache),这将使访问数据的所有用户受益。
MySQL将始终以相同的方式生成您的数据。 第1页上的记录显示在第2页的唯一方法是在用户从第1页导航到第2页之间插入新记录。换句话说:您无需担心。
资源是MySQL的情况是指向结果集的各种指针。 然后,您可以操作它(逐行获取数据,计算返回的行数等)。 它不是全球性的。
A.当然是第一个。 还有其他的方法,比如地球上的每一件事,但是对于地球上的每件事物,首先必须使用最普通和最通用的方法 ,因为它们必须熟悉它,因为它适合你当然,因为它适合其他网站管理员。
另请注意,您提出的其他方法并不合理。
B.是的,记录确实在页面之间移动。 没什么不好的。
C. PHP中没有任何内容可以保持调用之间的状态。 会话中不能保存任何资源。 去偏移分页。
在构造SQL时,您可以执行以下操作(0是偏移量,10是要返回的行数)
SELECT * FROM `your_table` LIMIT 0, 10
这将显示数据库的前10个结果。
替代语法,3个查询,显示前30个结果1-10,11-20,21-30。
SELECT * FROM `your_table` LIMIT 10 OFFSET 0
SELECT * FROM `your_table` LIMIT 10 OFFSET 10
SELECT * FROM `your_table` LIMIT 10 OFFSET 20
编辑:
好的,澄清一下,选项1是你最好的选择。 传入页码。 每个查询的限制是相同的, $offset = ($pageNum - 1 ) * 10;
。
您将需要一个ORDER BY
子句。 但是,如果数据库的内容在页面加载之间发生变化,则用户可能会注意到差异。 这实际上取决于数据更改的频率。
我没有尝试在会话中存储mysql_query()的结果。 我怀疑不是你想用它的方式。 当脚本结束时,您可以考虑隐式调用mysql_close(),并销毁资源。
从我的经验(不多),我通常使用第一种方法,因为每次你去另一个页面,你总是会从mysql获得更新的数据。 是的,如果您通过last_updated_time使用订单,则结果将跨页面移动。
但我认为这不是你的想法。 正如您在第三个问题中提到的,也许您希望为结果提供某种缓冲区,但这意味着您必须为每个结果创建缓冲区(这就是您提到使用文件存储mysql结果的原因)。
可能这是你正在寻找的答案(如果可以考虑作为答案:LOL),但我的目的只是试图给出一些观点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.