【问题标题】:PhP/MySQL Storing User Searches between Pages so the User Can Go Back to ThemPhP/MySQL 在页面之间存储用户搜索,以便用户可以返回它们
【发布时间】:2010-01-24 04:35:32
【问题描述】:

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

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

这可以将它保存在数据库中,或者以某种方式保存在 php 中——也许是会话?这些搜索可能会产生很多数据,我觉得对于会话来说可能太多了。

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

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

【问题讨论】:

标签: php mysql search data-persistence


【解决方案1】:

memcached

APC

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

我建议您构建您的应用程序并对其进行分析。这些“搜索”的成本有多大? 为什么它们很昂贵?它是糟糕的架构设计吗?是不是索引不好?存储引擎选择不当?

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

【讨论】:

  • 我实际上并不知道 MySQL 有查询缓存。我正在自学php和mysql。很高兴知道,我会试一试,看看效果如何。
  • 抱歉延迟接受,我花了一段时间来测试这个。
【解决方案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] 或数据库中获取查询字段...

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

创建一个结果表很好(并且会加快复杂搜索的分页速度),但您可能会在其中获得数百万次点击,因此使用缓存进行分页将是更通用的方式。

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

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2012-01-12
    相关资源
    最近更新 更多