1

当单击任何一组链接时,我想将会话变量设置为 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,然后使用“标题”从 clear.php 移动到最终目标。

4

4 回答 4

3

需要 Ajax 吗?如果您将用户重定向到另一个页面并且您只是想将一些数据传递到该页面,那么将这些数据包含在您的 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);
        });
}
于 2012-09-14T19:30:15.517 回答
2

我的猜测是这与 AJAX 的异步性有关,一些浏览器在加载新链接之前会正确触发 AJAX。其他人可能会因为页面正在更改而取消 AJAX 请求。尝试阻止锚点的默认操作,然后window.location在 ajax 调用返回后用于重定向它们。

$("#hdr li a").click(function (e) {
    var href = $(this).attr('href');
    e.preventDefault()
    $.post("clear.php", function () {
        window.location = href;
    });
});
于 2012-09-14T19:25:51.783 回答
0

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

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

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

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

于 2012-09-14T19:40:38.590 回答
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(); 
于 2019-07-21T13:30:59.520 回答