PhP / MySQL在页面之间存储用户搜索,以便用户可以返回到他们

时间:2010-01-24 04:35:32

标签: php mysql search data-persistence

我正在编写一个php-mysql应用程序。该应用程序允许用户对数据库运行搜索。当搜索运行时,如果用户在检查由其提出的项目后单击后退按钮返回到它,则会询问他们是否要重新发送查询(它使用post)。哪个会重新运行数据库中的搜索。使用get不会导致重新发布请求 - 但它仍然会再次运行搜索。

有没有办法存储搜索并调用它,而无需在数据库中重新运行?

这可以将它保存在数据库中,或者以某种方式保存在php中 - 可能是会话?这些搜索中可能会有大量数据,我觉得这对于会话来说可能太多了。

我能想象的另一种方法是将它存储在数据库中,在某种临时表中。使用我打算查询的列创建表,然后选择插入。然后从表中选择*。这似乎也是一个坏主意。大量动态创建的临时表浮动。

我知道这可以做到。保存的搜索是您在许多Web应用程序中看到的内容。那通常怎么做?

2 个答案:

答案 0 :(得分:2)

memcached

APC

但是,我注意到您没有给出任何理由为什么要缓存搜索结果。 “因为它更快,我读到它使我的应用程序更具可扩展性”,这是通常的原因。这闻起来就像是过早优化。

我建议您构建应用程序并对其进行配置。这些“搜索”的成本有多高? 为什么它们代价高昂?是不好的架构设计?它索引不好吗?存储引擎选择不好吗?

你确实意识到MySQL有一个query cache,对吗?在许多情况下,这可能就是您所需要的。尝试使用mysql客户端运行一个昂贵的“搜索”查询并记下时间,然后再次运行它。见

答案 1 :(得分:2)

修复“你想重新提交”错误,你可以将请求存储在会话或数据库中,然后立即重定向到新页面以实际执行搜索:

search.php?searchId=22

if (isset($_GET['searchId'])) {
  $search = $_SESSION['search'][$_GET['searchId'];
  // do search
} elseif (isset($_POST['search'])) {
  $_SESSION['search'][] = $_POST;
  header('Location: search.php?searchId=' . (count($_SESSION['search']) - 1);
}

然后可以从$ _SESSION ['search'] [22]或db ...

中获取查询字段

至于保存结果,您可以依赖浏览器的缓存,或者您可以在会话或数据库中存储单个SERP ...如果需要,可以在某些时候将旧的SERP存在...

创建一个结果表很好(并且可以加快复杂搜索的分页),但是你可能会有数百万次点击,所以对缓存的分页会更通用。

如果用户想要在几天或几周后返回搜索,您只需使用已保存的查询字段重新运行搜索。