如何存储搜索结果?

时间:2010-06-18 10:03:07

标签: php javascript jquery

我正在我的个人网站上工作,我希望将我的客户最近的搜索结果仅限于特定会话

我正在使用 PHP 平台和 Javascripts

Here 是我正在看的一个例子

存储 特定会话的以前搜索过的域名名称,以便用户可以通过比较这些结果来做出决定。

感谢。

编辑 - 非常感谢您的所有答案和建议。

但如果你注意到了 above example

同一页上看似某种加载新内容的脚本刷新保留以前的搜索内容 <div>原样。

如何使用 javascripts或某种div层来实现这个目标 ????

3 个答案:

答案 0 :(得分:2)

更新开始

此示例使用页面重新加载。如果你想在没有页面重新加载的情况下这样做,你可以但是你必须使用AJAX来加载新的搜索结果。但是,这不是一个PHP问题。我建议查看jquery库,因为它很容易。教程:http://docs.jquery.com/Tutorials和这一个(http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery#Rate_me:_Using_Ajax)。

通过AJAX加载数据时,页面呈现结果(在我的示例中为search.php)应仅返回结果部分的HTML,而不是整个HTML页面。这通常是我的教程的第一部分(没有会话)。

但我真的认为这里的AJAX并不是真的需要。会话更可靠,允许从旧版/移动浏览器访问您的页面,而这些浏览器并不总是能正常运行。

更新结束

好的。我们来试试这个简单的教程吧。对不起,如果太简单,但我不知道你的确切等级。

PHP具有称为会话的机制。实际上,它们只是存储在服务器上的字节。服务器通过从客户端浏览器读取会话cookie来了解每个客户端的会话。

并非每个页面都使用会话(并非每个页面都需要会话,并且会话使用服务器空间,即使只是临时),默认情况下不启用会话。要打开会话,请使用命令

<?php session_start(); ?>

在大多数情况下,这可以由您使用的PHP框架运行,也可以放在您网站的顶部附近。如果您想以某种方式验证用户,则肯定需要Session。或者在你的情况下:)

要访问会话,您可以使用超全局$_SESSION变量(超全局意味着您可以在任何地方访问它)。它是一个数组,因此会话元素将是例如$_SESSION['search']等。

例如,我们假设您的页面看起来像那样

<html>
...
<form action="search.php" method="post">
Search: <input type="text" name="searchQuery" />
<input type="submit" value="Search" />
</form>
...
</html>

这个表单会将用户搜索发送到名为search.php的文件。它可以是表单所在的同一文件 - 最简单的情况是将代码和HTML放在一个文件中。初学者经常使用这种模式,虽然这是不可取的,因为结果很混乱,很难进一步改变。

在search.php中,您将使用类似的代码:

<?php
if (!empty($_POST['searchQuery'])) //we have a new search
{
  $result = do_search($_POST['searchQuery']);
}
?>

然后,在下方的某处,您将显示搜索结果($result变量)。 do_search()函数是你的搜索机制,我想你有它在某个地方。你可能没有把它“包裹”在一个函数中,然后我建议像这样创建它,它会更有用。

function do_search($searchQuery)
{
  ...
  return $result;
}

请注意,上面的代码还没有使用会话。让我们在会话中添加保存以前的搜索结果。然后代码可能如下:

<?php
session_start(); //Starting session

//let's create session variable used to store results
if (!isset($_SESSION['searches']))
  $_SESSION['searches'] = array();

if (!empty($_POST['searchQuery'])) //we have a new search
{
  if (isset($_SESSION['searches'][$_POST['searchQuery']]) //User already searched on this value, delete previous result from sesion
  {
    unset($_SESSION['searches'][$_POST['searchQuery']]);
  }
  $result = do_search($_POST['searchQuery']);
  //Let's add new search on the begining of session array to make iterations easier.
  $result = array($_POST['searchQuery'] => $result); //convert result to same format as session table
  $_SESSION['searches'] = array_merge($result, $_SESSION['searches']);
}
?>

在显示中你现在不像以前那样迭代$ result变量,而是你会做类似的事情

foreach ($_SESSION['searches'] as $query => $result)
{
  ...//display of single result
}

我没有测试过以下代码,但这不是一个完整的程序。显示结果和进行实际搜索的部分没有描述,但我想你已经准备好了它们。而且,这只是无数可能性的一种可能方法。但我希望这有助于:)

可能的修改 - 现在我总是执行搜索,即使用户已在此术语上搜索过。您可能希望在没有第二次搜索的情况下从缓存接收结果。然后代码看起来像

if (isset($_SESSION['searches'][$_POST['searchQuery']]) //User already searched on this value
{
  $result = $_SESSION['searches'][$_POST['searchQuery']];
  unset($_SESSION['searches'][$_POST['searchQuery']]);
}
else
{
  $result = do_search($_POST['searchQuery']);
}

有关会话的更深入信息以及我的示例中使用的一些其他构造,我建议使用PHP手册

http://pl.php.net/manual/en/book.session.php

以及网络上的各种教程。或者你可以在这里添加评论:)

答案 1 :(得分:1)

将此代码放在脚本的开头附近:

if (!isset($_SESSION['previous_searches']) || !is_array($_SESSION['previous_searches'])) {
  $_SESSION['previous_searches'] = array();
}

[编辑]
此代码段检查是否已有一个包含大量搜索的数组,如果没有,则会创建 [/编辑]

然后,当用户点击搜索页面时,将此代码放入搜索的接收脚本中:

$_SESSION['previous_searches'][] = $_GET['what_ever_your_search_value_might_be'];

[编辑]
此代码段将当前搜索值添加到具有先前搜索值的数组和 [/编辑]

现在,您拥有$_SESSION['previous_searches']

中的所有先前搜索值

答案 2 :(得分:0)

如果您的网站是一个Web应用程序,您从不重新加载页面或更改页面,您可以将JavaScript保存在全局存储中(在顶层声明类似var StoredSearch = [];并使用它)。如果没有,那么使用$_SESSION存储它和AJAX来保存/加载从JavaScript到PHP的搜索。