PHP会话ID相同但变量丢失。

5
我有一个登录页面,成功登录后会设置会话变量。然后,该登录页面会重定向到管理员页面。管理员页面可以很好地读取会话变量。但是,当我在内容div中使用jQuery load()函数加载viewUsers.php时,会话变量消失了。奇怪的是,会话ID是相同的。
我在管理员页面和viewUsers页面上都使用了var_dump()。管理员页面显示来自登录页面的所有正确变量,但是用jQuery load()函数调用的viewUsers页面的$_SESSION的var_dump为空。$_COOKIE['PHPSESSID']的var_dump具有正确的ID,但这对我来说毫无意义。
以下是我设置会话变量的方式。
$_SESSION['userID'] = $userInfo['ID'];
$_SESSION['userType'] = $userInfo['userType'];
$_SESSION['programID'] = $userInfo['programID'];

这是jQuery。
$("#content").load("viewUsers.php");

所有页面在顶部都有session_start()。当我尝试使用window.open和window.location而不是jQuery的load()函数时,会导致session变量也无法正常工作。
一些方式使得session变量丢失,即使我有正确的session id。如果有人能够解决这个问题,我会非常感激!
目前,我正在填充隐藏字段并使用post函数来绕过它。我知道这不是最好的方法,但这是我找到的唯一方法。
编辑:这里是index文件的顶部,可以正常读取session变量。
 <?php
    session_start();
    //require("session.php");
    if(!isset($_SESSION['userID'])){
        header("location: ../login/index.php");
    }
?>

这里是完整的查看用户视图。
    <?php 
session_start();

//foreach($_POST as $name => $value){
    //$_SESSION[$name] = $value;
//}

//echo " session id " . $_COOKIE['PHPSESSID'];
var_dump($_COOKIE);
var_dump($_SESSION);
?>

<?php require("adminFunctions.php"); ?>


<h2>View Current Users</h2>
<?php require("userlinks.php"); ?>
<table id="userTable" class="tablesorter">
    <?php getUsers($_SESSION['programID'], $_SESSION['userType']) ?>
</table>
<script type="text/javascript">

    $('td[name="userID"]').hide();

    //$("#userTable th").click(function(){
        //color();
        //colorTable();
        //color();
    //});

    function colorTable(){
        $("tr:odd").css("background-color", "#c0c0c0");
        $("tr:even").css("background-color", "#ffffff");
    }

    function color(){
        $("tr:odd").css("background-color", "#ffffff");
        $("tr:even").css("background-color", "#ffffff");
    }

    $(document).ready(function(){
        //colorTable();
        $("#userTable").tablesorter({widgets: ['zebra']});

    });
</script>

另一个编辑: 这是加载viewusers的javascript代码。 我使用post的唯一原因是我将会话变量设置为隐藏字段,以便传递会话变量。在viewusers中,我使用foreach循环来设置会话变量。我知道这不安全。 function maintainUsers(){

$.post("viewUsers.php", $("#sessionform").serialize(),function(data){
        //alert(data);
        $("#content").load("viewUsers.php");
    });
}
6个回答

1
如果您得到了正确的 $_COOKIE['PHPSESSID'],那么请尝试在 session_start() 之前添加 session_id() 赋值,就像这样:

<?php
    /** Add this: **/
    if (isset($_COOKIE['PHPSESSID']))
        session_id($_COOKIE['PHPSESSID']); 
    /** Start session **/
    session_start();

    /** Rest of the script... **/
    if(!isset($_SESSION['userID'])){
        header("location: ../login/index.php");
    }
?>

我经常使用这个功能,在PHP中没有遇到过会话问题。


1

可能有些冒险,但您是否使用任何框架或 CMS?我知道 WordPress 会删除会话变量 (http://blog.ginchen.de/en/2008/08/15/session-variablen-in-wordpress/),您能展示一下您用来加载 viewUsers 的 JavaScript 代码吗?您是在本地服务器上进行编程吗?


1

您在 PHP 开始标签之前有一些空格。它们会向浏览器发送输出,因此会导致会话无法启动。


我忘记写了,请删除那些空格。 - beerwin
在此处粘贴文本时可能会添加额外的空白。另外,在session_start()之前的空格会导致警告。 - Dalibor Filus

1
我怀疑会话没有被启动。过去我也遇到过类似的问题,最后发现会话根本没有开始。
一个问题:你是否尝试打印会话变量中的值以确保它存在?
在调用页面之前和之后都可以这样做。

0
我建议使用简单的方法。 在每个文件中都包含这个。
<?php
session_name("yourapplication_session");
session_start();

?>

0
通常,这种错误发生在您没有使用session_start()来读取会话数据时。尝试放置(虽然您说过您已经这样做了,我建议再次检查)
session_start();

在你的viewUsers.php文件的开头处

如果以上情况不是这样的话,那么你当前的页面(从中执行.load()函数的页面)正在重置会话并篡改值。除非你上传代码或找到解决方法,否则这种情况没有解决方案。


1
不过,如果您上传 viewUsers.php 的代码,我们可以给出更好的答案。 - Starx
谢谢你的回答,我很感激。但是我已经做过了并且已经仔细检查过了 :)。 - Nick
@Nick,你的viewUsers.php没有影响到session。也许是执行.load()函数的页面在做些什么。请上传该页面的代码。 - Starx
我指的是整个页面,而不仅仅是 JS 部分。 - Starx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接