Php 如何向未登录用户显示唯一内容?

Php 如何向未登录用户显示唯一内容?,php,algorithm,session,Php,Algorithm,Session,我正在创建一个网站,在那里我需要向用户显示随机片段,这些片段每隔几秒钟就会不断变化。代码片段数据库本身将非常庞大。我想的是最好的方式,让他们看到一个片段,而不重复它 所以我的问题是: $random = '<value between 1 and row_count of table>'; $query = `select snippet from table limit $random,1`; 然后我向用户显示该代码段。这将很好地工作,但我如何确保用户在访问期间不会再次看到相同的

我正在创建一个网站,在那里我需要向用户显示随机片段,这些片段每隔几秒钟就会不断变化。代码片段数据库本身将非常庞大。我想的是最好的方式,让他们看到一个片段,而不重复它

所以我的问题是:

$random = '<value between 1 and row_count of table>';
$query = `select snippet from table limit $random,1`;
然后我向用户显示该代码段。这将很好地工作,但我如何确保用户在访问期间不会再次看到相同的代码片段?而且,并没有登录名,所以我无法将代码段与用户id关联

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


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

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

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

SELECT * FROM table where id not in (snippets, from, session) ORDER BY RAND() ASC limit 1
显然,我假设您将在会话中存储代码段的ID

还要注意的是,非IN或IN并不是最有效的解决方案,但这应该可以用来进行概念验证使用以下代码:

SELECT snippet FROM snippets ORDER BY rand() LIMIT 1

您可以将代码段ID作为数组存储在cookie中,即它应该具有所有可见的ID,而在获取新ID时,您应该从该cookie数组变量中获取所有ID,并从cookie数组中以不在ID中的形式进行查询。

注意:此解决方案使用cookie

当用户加载代码段时,将代码段ID存储在cookie中。 要加载下一个代码段,请搜索cookie的值,并使用它生成新的代码段id。提示:使用当前id我想它是一个数字作为RNG的种子。如果没有cookie,这是第一次访问,然后选择一个随机数。 转到1 如果您将cookie的生命周期设置为相对较短,您将非常确定用户不会陷入预定的序列中

当用户在同一个会话中查看大量代码片段时,NOT IN关键字或方法的其他解决方案派生无法很好地扩展。。。我希望你应该为长时间的训练做计划。。。Stumbleupon.com是一个很好的长时间上瘾会话的例子,它可以获取很多不同的页面。这和你的想法很相似

祝你好运

编辑:再次思考这个算法,我发现了一个缺陷:如果以前一个ID作为种子获得的随机ID给出了一个已经使用过的数字,用户现在处于循环中示例:a生成B生成C。如果C生成a或B,则用户处于循环中

因此,如果您的用户发现一个副本,您可以添加一个名为signal duplicate的链接,该链接只需删除cookie并生成一个新的随机ID。这种新方法有两个优点:

给来宾用户一种错觉,认为他实际上可以控制工作流,甚至可以与工作流交互 解决了上面解释的循环错误。
即使您没有发布代码,您也已经发布了您的计划、考虑事项以及它们是次优的事实。如果每个人都像你一样,那将是一个更好的地方。我唯一担心的是,如果用户达到行计数阈值,我们需要从一个较低的数字重新启动,然后就有可能出现重复,对吗?但这是一个值得考虑的好建议+1!@好吧,我不认为这是个问题,因为你说过你会有一个相当大的数据库。此外,您正在与未登录的用户合作,如果他们想要更好的服务,他们可以随时注册,对吗;无论如何,随机数并不总是在增加,而是在行上下跳跃,因此没有行数达到问题,不管怎样,如果我只是在Stumbleupon中得到一个副本,我只需单击以获得一个新的。谢谢你的回答,是的,目前我正在考虑存储代码段的id。我只是担心它是否会变得太大。我相信,尽管请不要引用我的话,饼干的大小限制是4k左右。会议规模要大得多。你应该可以在那里得到很多身份证,如果这就是你储存的全部。