单击链接时设置会话变量

时间:2012-09-14 19:20:46

标签: php javascript ajax jquery

我希望在点击任何一组链接时将会话变量设置为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移动到最终目的地。

4 个答案:

答案 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();