在AJAX请求上清空$ _SESSION超全局,但保留会话ID

时间:2012-06-10 07:58:54

标签: php session sessionid

我在AJAX请求上遇到$_SESSION超全局问题。

在任何会话编码之前调用

session_start()函数。会话ID在调用代码和AJAX响应代码中也是相同的(在两个脚本中通过回显session_id()进行测试)。 AJAX PHP文件位于同一个域中。一切都应该按标准定义,但是当我在被调用的AJAX脚本文件中print_r($_SESSION)时,我得到Arrray( )输出。

我撞到了砖墙......我不知道为什么这不起作用......

在Chrome和Firefox中都检查过。

有什么想法吗?

更新

问题在于$.ajax(...)请求!当我执行AJAX请求时,它知道正确的会话ID,session_start()函数返回TRUE(成功继续会话),但随后它重置了我的$_SESSSION超全局!它把它清空......我不知道为什么......

代码:

的index.php:

<?php

session_start();

$_SESSION['Test']='O.K.';

echo("SESSION_ID: " . session_id());
echo("SESSION_SIZE:" . sizeof($_SESSION));

?>

... Standard HTML stuff and jQuery include ...

<script>
    $.ajax(
    {
        type: "POST",
        url: "AJAXTest.php",
        data: null,
        success: function(sData) { alert(sData); }
    });

</script>

AJAXTest.php:

<?php

session_start();

echo("SESSION_ID: " . session_id());
echo("SESSION_SIZE:" . sizeof($_SESSION));

?>

index.php输出:

SESSION_ID: xxxxxxxxxxxxxxxxxxxxxxx
SESSION_SIZE: 1

警报输出:

SESSION_ID: xxxxxxxxxxxxxxxxxxxxxxx (right session id)
SESSION_SIZE: 0

在AJAX调用之后$ _SESSION为空。在具有相同会话的所有其他脚本中......我感到困惑......

3 个答案:

答案 0 :(得分:1)

可能是因为如果你没有在$_SESSION中放任何价值。它会在print_r($_SESSION)上显示array()

尝试设置值$_SESSION['user']='frankie'

然后做print_r($_SESSION);
session_id()永远不会显示在$ _SESSION数组中。

答案 1 :(得分:1)

这可能是一个问题,不是AJAX,而是会话本身。现在您只是测试$ _SESSION数组和会话ID,而不是会话存储本身。尝试查看会话状态是否在几个非AJAX请求中保持相同。例如,使用此:

$_SESSION['Test' . time()]='O.K.';

而不是:

$_SESSION['Test']='O.K.';

刷新页面时,您的SESSION_SIZE计数应该会增加。如果它没有增加,php.ini中的会话存储参数可能不正确吗?例如,如果您将文件用于会话,则会在编写文件会话或memcache问题时出现问题。

还要确保在页面和ajax调用之间没有其他请求 - 也许某个被调用的脚本会重置你的$ _SESSION数组?

答案 2 :(得分:0)

问题出在我的自定义php.ini文件中......显然搞砸了一些会话重要设置(即使它们没有定义 - &gt;已更改)。

结果是每次调用session_start()都会重置$ _SESSION superglobal并将其清空,但保留相同的会话ID会使我感到困惑并向错误的方向投掷。直到我剥离了所有内容,很明显错误不在我的代码中。

感谢所有感兴趣的人。