jQuery POST请求后,PHP会话数据丢失

时间:2015-06-05 21:24:29

标签: php session post

我知道这个问题看起来好像被问了很多次,但请继续阅读。

问题是,与标题建议一样,当我向另一个页面发出POST请求时,会话数据没有保存在我的PHP脚本中。

  • 是的,所有脚本在第一行都有session_start();
  • 是的,我已经检查过session_id是否相同,而且是。
  • apache日志没有显示任何错误(我已经显示了所有错误) 误差)
  • 我测试了会话是否正在创建用于创建/读取会话变量的简单页面并且它有效。当我使用POST请求时,它表现得很奇怪。

两个脚本都在同一台服务器上。

我将编辑我的代码,以显示它的作用。

脚本A

<?
session_start();

echo session_id()."<br>";
print_r($_SESSION);

require_once __DIR__ . '/include/config.php';

ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);

session_set_cookie_params(
    0,
    ini_get('session.cookie_path'),
    ini_get('session.cookie_domain'),
    isset($_SERVER['HTTPS']),
    true
);

$_SESSION['haygsdb18'] = true;
$_SESSION['user_name'] = '';
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
$_SESSION['REMOTE_ADDR'] = md5($_SERVER['REMOTE_ADDR']);

$include_path =  str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);

?>

$.post(
    "<?=$include_path?>/include/ScriptB.php",
    {OTP: OTP},
    function(data) {
        alert(data);
    }
);

脚本B

<?
session_start();

$msg = session_id()."\n";
$msg .= print_r($_SESSION,true);
exit($msg);
?>

这样我就可以调试了。脚本B显示相同的会话ID,但没有会话变量。

我试图弄明白我的想法。另一件让我感到震惊的事情是,服务器中另一个文件夹中的相同脚本(完全相同,复制粘贴)运行良好。

请帮助......我没有想法。

更新:更多调试信息

我在终端中使用sess查看了php创建的tail -f文件。加载脚本A时,变量将写入文件中,当进行AJAX调用时,文件将被清空(不删除,只清空)。

当脚本A执行$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);时,sess文件使用HTTP_USER_AGENT|s:32:"2589a220583546006658f54ada687b45";编写,但当脚本B执行$_SESSION['TEST'] = '1';时,sess文件中的所有内容都将替换为C1Hw6hhbpX-jWhvbRfz_reKX4tT66bcNpYGLGzxEg7I. }

大量的调试......发现了一个奇怪的事情

我比较了session_handler在我使用相同登录脚本的其他系统中编写sess文件的方式。在其他系统中,脚本A和脚本B正在将加密信息写入文件。问题是在这个特定的系统中,脚本A没有使用任何加密来编写文件,但脚本B是。

我怀疑脚本B期望会话信息是加密的,所以因为它不是它无法读取变量而它们已经消失了。当试图将变量从脚本B保存到脚本A时,也会出现同样的情况。

所以现在我的问题是,当我还没有告诉他们这样做时,脚本A和脚本B如何使用不同的session_write处理程序?我如何强迫他们使用相同的东西?

5 个答案:

答案 0 :(得分:11)

我终于明白了。

正如我在问题中发布的那样,问题是session_handler正在使用不同的编码编写sess文件。因此,两个尝试读取文件的脚本都没有正确读取变量。

我有一个php.ini文件,用于使用指令

更改默认字符集
default_charset = "iso-8859-1"

我不得不使用此指令,因为服务器管理员做了一些更改。我在根目录中创建了一个.user.ini文件以使用ISO编码,但我忘记删除此php.ini文件。

由于php.ini文件仅影响其中一个脚本(另一个文件位于不同的文件夹中),因此charset可能会破坏编码/解码过程。所以我删除了该指令,问题就消失了。

希望这个问题能帮助将来的某个人。

答案 1 :(得分:0)

您的会话未写入磁盘或您正在使用的任何存储,因为在您进行ajax调用时可能无法完成脚本执行。

您可以使用session_write_close()函数将会话数据保存到存储(很可能是您的/ tmp /文件夹) http://php.net/manual/tr/function.session-write-close.php

<?php
session_start();
echo session_id()."<br>";
print_r($_SESSION);


ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);

session_set_cookie_params(0,ini_get('session.cookie_path'),ini_get('session.cookie_domain'),isset($_SERVER['HTTPS']),true);

$_SESSION['haygsdb18'] = true;
$_SESSION['user_name'] = '';
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
$_SESSION['REMOTE_ADDR'] = md5($_SERVER['REMOTE_ADDR']);
//write the session before the script execution ends
session_write_close();

$include_path =  str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    <script type="text/javascript">
            $(document).ready(function() {

                $.post("scriptB.php", {OTP: "OTP"}, function(data) {
                    alert(data);});

            });

    </script>

</head>
<body>

</body>
</html>

这是我的输出;

tdiiqame0i4ldshc8m20n8d9o6
Array
(
    [haygsdb18] => 1
    [user_name] => 
    [HTTP_USER_AGENT] => bc9d9d38aa0626db612842a1e0d09ea9
    [REMOTE_ADDR] => f528764d624db129b32c21fbca0cb8d6
)

答案 2 :(得分:0)

尝试设置会话时间:

define("SESSION_TIME_EXPIRED",'172800');    
session_set_cookie_params(SESSION_TIME_EXPIRED); 
session_name('user');
session_start();

答案 3 :(得分:0)

session_set_cookie_params(0, ...)创建立即过期的会话?

http://php.net/manual/en/function.session-set-cookie-params.php

答案 4 :(得分:0)

I had a same problem. I was using custom sessions. use this

session_regenerate_id();

NOT

session_regenerate_id(true);

use this just after starting session