2009-11-06 110 views
3

处理返回搜索结果的网页的正确方法是什么?这种搜索的结果可能会有不同的结果。寻呼:存储搜索结果

I.e.第一次返回查询可能包含与用户在第2页上单击时不同的结果,并再次运行查询。

大多数人如何处理这种情况?一般来说,我正在使用内部的ASP.Net应用程序(安全/带宽并不是很大的担忧),所以我会将结果存储在ViewState中,并在回发处理与查询数据库相反的数据。

外部WWW使用的正确方法是什么?我最好的猜测是将结果存储在一个临时数据库表中(不是字面上的临时表;我想'暂存'可能更准确),但是我认为该表会因插入/删除/ etc而受到很大影响,我认为你需要一个清理桌面的过程,这看起来不是一个非常优雅的解决方案。

我在哪里关门?

回答

2

大多数应用程序不处理它...他们认为结果不会变化足以保证某种缓存机制。但是,如果你有高度的实时数据工作(如Twitter的结果,例如),您的分页链接将最有可能是这样的:

?q=your+query&olderthan={last result shown}&limit=10

...其中{last result shown}是对的ID在当前页面上的最后结果。此ID将用于允许您查询比指定ID更早的结果:SELECT * FROM table WHERE id < {last result shown}

+0

我已经看过这么多次,这是一个有效的解决方案,但如果你想要或需要使用POST与GET,将无法正常工作。此外,这需要在您的应用程序中处理安全性 - 否则sombody可以将URL更改为限制= 200000 - 并且如果您显示产品列表,那么可以说 - 您可以让服务器受到攻击并冻结浏览器:-) – konung 2009-11-06 20:01:29

+0

此方法仅适用于罚款与POST请求。只需将其放入'。关于界限......我认为这是不言而喻的;) – brianreavis 2009-11-06 20:23:09

+0

我喜欢'olderthan'的概念。查询字符串可以根据您允许的内容进行验证,或者值可以存储在视图状态中 – John 2009-11-06 20:32:10

1

虽然它可能会占用大量内存,但您也可以考虑将搜索结果存储到会话中并通过会话进行分页,而不是每次都运行查询。

1

会话如何?这是会话特有的临时数据,为什么不使用会话?

我还没有在年龄(从.NET时代之前:-))做asp,但在PHP或rails中,您可以使用会话来处理任何临时存储。您可以使用本地文件系统(在服务器上)或DB作为会话存储。有很多方法可以进行优化,所以我不会担心数据库受到攻击,除非有成千上万的用户。此外,数据库设计用于处理数千个插入和删除操作 - 任何主要的数据库--SQL服务器,MySQL,PostgreSQL都不应该有任何问题。