我的目标是使用以纯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,但无济于事。)