繁体   English   中英

MySQL的分页导致PHP

[英]Pagination of MySQL results in PHP

直到最近,我才真正将这个(分页)视为一个问题。 当我坐下来并注意它时,我发现自己面临着许多问题。

我所涉及的是基本联系人管理系统,其中用户可以添加/更新/删除/搜索联系人。 搜索部分是我需要有效实施分页的地方。

我有什么想法(+ ve和-ve点)

  • 我可以在POSTsearch.php页面时指定pageNooffset 此页面将触发一个简单的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM