4

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

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

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

在 Chrome 和 Firefox 中都检查过。

有任何想法吗?

更新:

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

代码:

索引.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 为空。在同一会话的所有其他脚本中......我很困惑......

4

3 回答 3

1

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

结果是每次调用 session_start() 都会重置 $_SESSION 超全局并将其清空,但留下相同的会话 ID,这让我感到困惑并朝错误的方向抛出。直到我把一切都剥离到骨子里,很明显错误不在我的代码中。

感谢所有感兴趣的人。

于 2012-06-11T06:34:06.710 回答
1

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

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

而不是这个:

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

刷新页面时,您的 SESSION_SIZE 计数应该会增加。如果不增加,可能是php.ini中的session存储参数不对?例如,将会话写入文件时出现问题,或者如果您将其用于会话,则会出现 memcache 问题。

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

于 2012-06-10T13:09:47.397 回答
1

这可能是因为如果你没有在$_SESSION. 它会告诉你 array()print_r($_SESSION)

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

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

于 2012-06-10T08:16:10.430 回答