使用JavaScript AJAX设置SESSION变量(即不使用JQuery AJAX)

时间:2016-04-10 07:04:55

标签: javascript php jquery ajax session

我的目标是使用以纯JavaScript编写的AJAX调用来设置会话变量,而不是使用JQuery。有两个文件:index.php文件和AJAX调用的PHP文件ajax_set_session.php

index.php启动一个新会话,将SESSION变量MyVariable设置为字符串' false' (即不是布尔值false),打印SESSION的内容,然后写出调用ajax_set_session.php的AJAX例程。反过来,这会将MyVariable重置为' true'并创建一个新的SESSION变量YourVariable,并为其分配字符串' xxx'。修订后的SESSION的内容将在ajax_set_session.php内打印到控制台,并且在执行代码时,实际上修改了一个变量,并创建了另一个变量。然后index.php文件恢复并打印出SESSION的内容,这些内容是 not 修订的,我不明白。我检查了两个文件之间的session_id,它是一样的。

以下是index.php

的代码
<?php
session_start();
session_unset();
print_r('<pre>');
print_r('Before script:' . PHP_EOL);
$_SESSION['MyVariable'] = 'false';
print_r($_SESSION);
print_r('</pre>');
?>
<script>
var ajax = {};
var hasAX = window.hasOwnProperty("ActiveXObject");
ajax.x = function () {
    if (hasAX) {
        var versions = ["MSXML2.XmlHttp.6.0", "MSXML2.XmlHttp.5.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.2.0", "Microsoft.XMLHTTP"];
        var xhr;
        var i = 0;
        while (i < versions.length) {
            try {
                xhr = new ActiveXObject(versions[i]);
                break;
            } catch (e) {
                alert(e);
            }
            i += 1;
        }
        return xhr;
    } else {
        return new XMLHttpRequest();
    }
};

ajax.send = function (url, callback, method, data, async) {
    if (async === undefined) {
        async = true;
    }
    var x = ajax.x();
    x.open(method, url, async);
    x.onreadystatechange = function () {
        if (x.readyState === 4) {
            callback(x.responseText);
        }
    };
    if (method === 'POST') {
        x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    }
    x.send(data);
};

ajax.post = function (url, data, callback, async) {
    var query = [];
    Object.keys(data).forEach(function (key) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    });
    ajax.send(url, callback, 'POST', query.join('&'), async);
};

function logStuff(userData) {
    if (typeof userData === "string") {
        console.log(userData);
    } else if (typeof userData === "object") {
        Object.keys(userData).forEach(function (key) {
            console.log(key + ": " + userData[key]);
        });
    }
}

ajax.post('ajax_set_session.php', {MyVariable: 'true', YourVariable: 'xxx'}, logStuff, true);

</script>
<?php
print_r('<pre>');
print_r('After script:' . PHP_EOL);
print_r($_SESSION);
print_r('</pre>');
?>

以下是ajax_set_session.php的代码:

<?php
session_start();
print_r($_SESSION);
foreach($_POST as $key => $value) {
    $_SESSION[$key] = $value;
}
print_r($_SESSION);
exit();
?>

如果您在打开开发人员控制台的情况下运行代码,您会在index.php文件中看到SESSION未更改,但它会在ajax_set_session.php文件中按预期更改。为什么不保留对SESSION的更改? (我已尝试在async AJAX例程中切换index.php true和false,但无济于事。)

0 个答案:

没有答案