Php 单击链接时设置会话变量

Php 单击链接时设置会话变量,php,javascript,ajax,jquery,Php,Javascript,Ajax,Jquery,我想在单击某一组链接时将会话变量设置为0。为此,我在javascript文件中添加了以下内容: $(window).load(function () { $("#hdr li a").click(function () { $.ajax({ type: "POST", url: "clear.php", data: "width=0" }); }); }); (忽略数据:“w

我想在单击某一组链接时将会话变量设置为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之后,浏览器如何知道去哪里?不知何故,它是有效的,但我的第一个想法是,我应该将最终目标URL传递到clear.php,然后使用“header”从clear.php移动到最终目标。

我猜这与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;
    });
});

我猜这与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;
    });
});

是否需要Ajax?如果您将用户重新定向到另一个页面&您只是想将一些数据传递到该页面,那么将这些数据包含在您的URL中可能会更简单

<a href="http://yoursite.com/interesting_page.php?new_session_variable=whatever">Link</a>
现在您已经删除了对JavaScript的依赖,这有意义吗?:)


我觉得值得一提的是,您的方法在某些情况下是合适的,例如:如果您希望用户能够将页面上的一个链接标记为收藏夹。与其将它们重定向到同一页面并重新加载大部分页面内容,您可以:

<a class="favourite" data-linkid="link123" href="mylink.php">My Link</a>

是否需要Ajax?如果您将用户重新定向到另一个页面&您只是想将一些数据传递到该页面,那么将这些数据包含在您的URL中可能会更简单

<a href="http://yoursite.com/interesting_page.php?new_session_variable=whatever">Link</a>
现在您已经删除了对JavaScript的依赖,这有意义吗?:)


我觉得值得一提的是,您的方法在某些情况下是合适的,例如:如果您希望用户能够将页面上的一个链接标记为收藏夹。与其将它们重定向到同一页面并重新加载大部分页面内容,您可以:

<a class="favourite" data-linkid="link123" href="mylink.php">My Link</a>

访问者无法访问clear.php页面,因为您正在执行ajax调用

相反,您的浏览器使用XMLHTTPRequest对象通过javascript在下面发送请求,该对象不会破坏您的浏览器行为,因此加载a href指向的页面

如前所述:ajax调用是usless。您最好在页面顶部包含clear.php,并根据get param示例测试是否应该设置会话变量


如果您确实希望在浏览器进入新页面之前保留ajax调用,则可以在“重置”链接(事件委派)的第一个公共父级上附加事件处理程序,并测试是否应发送ajax请求以通知clear.php。由于您正在执行ajax调用,因此访问者无法访问clear.php页面

相反,您的浏览器使用XMLHTTPRequest对象通过javascript在下面发送请求,该对象不会破坏您的浏览器行为,因此加载a href指向的页面

如前所述:ajax调用是usless。您最好在页面顶部包含clear.php,并根据get param示例测试是否应该设置会话变量


如果您确实希望在浏览器进入新页面之前保留ajax调用,则可以在“重置”链接(事件委派)的第一个公共父级上附加事件处理程序,并测试是否应发送ajax请求以通知clear。php

我遇到了此问题。我想传递一个不同的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> 
显然,您需要在每页的开头开始一个会话:-

session_start(); 
完成后:-

// remove all session variables
session_unset();

// destroy the session
session_destroy(); 

我有这个问题。我想传递一个不同的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> 
显然,您需要在每页的开头开始一个会话:-

session_start(); 
完成后:-

// remove all session variables
session_unset();

// destroy the session
session_destroy(); 

它应该会起作用。但是,cookie设置可能会导致某些浏览器“丢失”会话cookie,使其看起来不工作,因为这些浏览器每次都会获得一个新的/干净的/空的会话。您想到的最终目标是什么?如果它是另一个php文件,也许你可以在那里设置会话变量,然后直接链接到新的php文件。@Marc B,也许我误解了你的观点,但是在不起作用的浏览器中,会话变量没有设置为零。这就好像浏览器只是绕过clear.php直接进入最终目的地