2

我正在创建一个网站,我需要向用户显示随机片段,这些片段每隔几秒钟就会不断变化。片段数据库本身将非常庞大。我正在考虑的是向他们展示片段而不重复的最佳方式。

所以我的查询是这样的:

$random = '<value between 1 and row_count of table>';
$query = `select snippet from table limit $random,1`;

然后我向用户展示该片段。这可以正常工作,但我如何确保用户在访问期间不会再次看到相同的片段?此外,没有登录,因此我无法将片段与用户 ID 关联。

我想我会在会话中存储片段 ID 并将其从下一个查询中排除。但我不确定这是否是最好的方法。还有其他解决方案吗?

有什么建议么?我正在使用 LAMP 进行开发,这就是为什么我添加了我拥有的标签。而且我知道我没有发布任何代码..

4

4 回答 4

1

注意:此解决方案使用 cookie。

  1. 当用户“加载”片段时,将片段 ID 存储在 cookie 中。
  2. 要加载下一个片段,请搜索 cookie 的值,并使用它来生成新的片段 ID。(提示:使用当前 id(我想它是一个数字)作为 RNG 的种子)如果没有 cookie,这是第一次访问,然后选择一个随机数。
  3. 去#1

如果您将 cookie 的生命周期设置为相对较短,您将非常确定用户不会卡在预定的顺序中。

当用户在同一个会话中查看很多片段时,其他解决方案(NOT IN关键字或方法的派生)不能很好地扩展......而且你应该计划长时间的会话,我希望...... Stumbleupon.com 是一个不错的获取大量不同页面的长时间上瘾会话的示例。这和你的想法很相似。

祝你好运!

编辑:再次考虑这个算法,我发现了一个缺陷:如果用前一个 ID 作为种子获得的随机 ID 给出了一个已经使用过的数字,那么用户现在处于循环中(例如:)#A generates #B which generates #C. If #C generates #A or #B the user is in a loop

因此,如果您的用户发现重复,您可以添加一个名为“信号重复”的链接,它会简单地删除 cookie 并生成一个新的随机 ID。这种新方法有两个优点:

  1. 给来宾用户一种他可以实际控制工作流程,甚至与之交互的错觉
  2. 解决了上面解释的循环错误。
于 2013-04-29T14:45:57.333 回答
1

如果您只担心用户当前的访问,那么存储在会话中就可以了。如果你想要更永久的东西,你可以使用 cookie。

要获得随机片段,您可以执行以下操作

SELECT * FROM table where id not in (snippets, from, session) ORDER BY RAND() ASC limit 1

显然,我假设您会将片段的 ID 存储在会话中

另请注意,就此而言,“NOT IN”或“IN”并不是最高效的解决方案,但这应该有助于获得概念证明

于 2013-04-29T14:43:21.600 回答
0

您可以将片段 ID 作为 array() 存储在 cookie 中(即)它应该具有所有可见的 ID,并且在获取新 ID 时,您应该从该 cookie 数组变量中获取所有 ID 并查询为NOT IN(来自 cookie 数组的 ID)

于 2013-04-29T14:45:44.910 回答
0

使用此代码:

SELECT snippet FROM snippets ORDER BY rand() LIMIT 1
于 2013-04-29T14:44:47.607 回答