我希望在点击任何一组链接时将会话变量设置为0。为此,我将以下内容放在我的javascript文件中:
$(window).load(function () {
$("#hdr li a").click(function () {
$.ajax({
type: "POST",
url: "clear.php",
data: "width=0"
});
});
});
(忽略数据:“width = 0”......我不在clear.php中使用这些数据。我把它放在那里因为我想我可能必须指定一个数据字段。)
并在文件'clear.php'中我只是:
<?php session_start();
$_SESSION['name'] = 0;
?>
因此,想法是当点击#hdr li中的任何链接时,应通过clear.php将用户带到链接所指向的页面,该会话变量将会话变量设置为0。
这适用于某些浏览器(Firefox和Chrome),但不适用于其他浏览器(例如Safari)。
这是实现我想要的标准/正确方法吗?另外,访问clear.php后,浏览器如何知道去哪里?它以某种方式工作,但我首先想到的是我应该将最终目标网址传递给clear.php,然后使用“header”从clear.php移动到最终目的地。
答案 0 :(得分:3)
需要Ajax吗?如果您将用户重定向到另一个页面&amp;您只是想将一些数据传递到该页面,然后将这些数据包含在您的URL中可能更简单。
<a href="http://yoursite.com/interesting_page.php?new_session_variable=whatever">Link</a>
现在你的php很简单:
$_SESSION['name'] = $_GET['new_session_variable'];
现在你已经删除了对JavaScript的依赖,这有意义吗? :)
我觉得值得一提的是,您的方法在某些情况下是合适的,例如:如果您希望用户能够将页面上的某个链接标记为收藏。而不是将它们重定向到同一页面并重新加载大部分页面内容,而不是:
<a class="favourite" data-linkid="link123" href="mylink.php">My Link</a>
// Ensure your page has finished loading aka: 'ready' (almost always)
$(document).ready(function() {
// Listen for the click event
$('.favourite').on('click', favoriteLink);
// On the click - post the update via ajax and update your interface
function favoriteLink(event) {
event.preventDefault();
// Lets get the link id from our data attribute
var favourite_link = $(this).data('linkid');
// Post that information via ajax
$.post('ajax_handler.html', { link : favourite_link }, function(data) {
// And finally do something with the result!
$('.result').html(data);
});
}
答案 1 :(得分:2)
我的猜测是这与AJAX的异步性有关,有些浏览器在加载新链接之前正确地触发了AJAX。其他人可能正在取消AJAX请求,因为页面正在发生变化。尝试阻止锚的默认操作,然后在返回ajax调用后使用window.location
重定向它们。
$("#hdr li a").click(function (e) {
var href = $(this).attr('href');
e.preventDefault()
$.post("clear.php", function () {
window.location = href;
});
});
答案 2 :(得分:0)
由于您正在执行ajax调用,访问者无法访问clear.php页面。
相反,会发生的情况是您的浏览器使用XMLHTTPRequest对象通过javascript发送请求,这不会破坏您的浏览器行为,因此加载了href指向的页面。
如上所述:ajax电话是无用的。你最好在你的页面上包含clear.php,并测试你是否应该设置你的会话变量,基于例如参数的参数。
如果您确实希望在浏览器到达新页面之前保留ajax调用,则可以在“重置”链接的第一个公共父级(事件委派)上附加事件处理程序,并测试是否应发送ajax请求通知clear.php
答案 3 :(得分:0)
我遇到了这个问题。我想根据用户单击的链接传递不同的sql字符串以从表中选择不同的行,但是我不想在GET中显示sql。
我的解决方案是为每个链接设置不同的会话变量,并从链接中传递会话变量的名称。我有几个链接,但这里仅包含2个示例。我的链接代码是:-
<?php $_SESSION["extend_stats_sql_01"] = "";
echo '<a href="view_stats_1.php?sort=name&sent=extend_stats_sql_01"> View</a>';}?> <br>
和
<?php $_SESSION["extend_stats_sql_02"] = " Where booking_status = 'Cancelled'";
echo '<a href="view_stats_1.php?sort=name&sent=extend_stats_sql_02"> View</a>';}?> <br>
我的代码用于检索下一页上的值以根据链接显示具有正确sql的列表,这是:-
$stats_sql = "SELECT id, name, activity, email, diving_date, arrival_date, checkin_date, create_date, seller FROM guests ";
$sort = $_GET['sort'];
$sent= $_GET['sent'];
$result = $_SESSION["$sent"];
$stats_sql.= "$result";
$stats_sql.= " ORDER BY $sort";
显然,您需要在每个页面的开头开始会话:-
session_start();
完成后:-
// remove all session variables
session_unset();
// destroy the session
session_destroy();