5

我有一个登录页面,可以在成功登录时设置会话变量。然后登录页面重定向到管理页面。管理页面能够很好地读取会话变量。但是当我在内容 div 中执行加载 viewUsers.php 的 jQuery load() 函数时,会话变量就消失了。奇怪的部分是会话 ID 是相同的。

我在管理页面和 viewUsers 页面上都使用了 var_dump()。管理页面显示来自登录页面的所有正确变量,但使用 $_SESSION 的 jQuery load() 函数 var_dump 调用的 viewUsers 页面是空白的。$_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() 函数时,会话变量也不起作用。

即使我有正确的会话 ID,会话变量如何丢失。如果有人能对此有所了解,我将不胜感激!

截至目前,我正在填充隐藏字段并使用 post 函数而不是 load 来绕过它。我知道这不是最好的方法,但这是我能弄清楚如何做到这一点的唯一方法。

编辑: 这是读取会话变量的索引的顶部。

 <?php
    session_start();
    //require("session.php");
    if(!isset($_SESSION['userID'])){
        header("location: ../login/index.php");
    }
?>

这是整个viewusers

    <?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的唯一原因是因为我将会话变量设置为隐藏字段以传递会话变量。在 viewuser 上,我使用 foreach 循环来设置会话变量。我知道这不安全。函数维护用户(){

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

6 回答 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 中的会话没有问题。

于 2011-05-20T10:19:58.083 回答
1

我怀疑会话没有开始。我过去也遇到过类似的问题,都是为了发现会话一开始就没有开始。

一个问题:您是否尝试打印出会话变量中的值以确保它存在?:

在调用页面之前和调用页面之后。

于 2011-12-11T03:35:04.740 回答
1

php open 标记前有一些空格。它们将输出发送到浏览器,因此会话不会启动。

于 2011-09-02T18:53:55.120 回答
1

可能是一个很长的镜头,但您是否使用任何框架或 cms?我知道wordpress会删除会话变量(http://blog.ginchen.de/en/2008/08/15/session-variablen-in-wordpress/)你能显示你用来加载viewUsers的javascript代码吗?你是在本地服务器上编程吗?

于 2011-05-03T06:24:39.510 回答
0

session_start()通常,当您不使用读取会话数据时会发生这种错误。

尝试放置(虽然,你说你有,我建议重新检查)

session_start();

在你的开始viewUsers.php

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

于 2011-04-29T06:12:45.720 回答
0

我会建议一些简单的东西。将其包含在每个文件中。

<?php
session_name("yourapplication_session");
session_start();

?>
于 2012-02-06T01:41:28.043 回答