我正在我的个人网站上工作,我希望将我的客户最近的搜索结果仅限于特定会话。
我正在使用 PHP 平台和 Javascripts 。
Here 是我正在看的一个例子:
存储 特定会话的以前搜索过的域名名称,以便用户可以通过比较这些结果来做出决定。
感谢。
编辑 - 非常感谢您的所有答案和建议。
但如果你注意到了 above example
在同一页上看似某种加载新内容的脚本刷新,保留以前的搜索内容 <div>
原样。
如何使用 javascripts或某种div层来实现这个目标 ????
答案 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的搜索。