PHP会话ID相同但变量丢失

时间:2011-04-29 05:54:59

标签: php jquery session-variables sessionid

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

我在admin页面和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的唯一原因是因为我将会话变量设置为隐藏字段以传递会话变量。在viewusers上,我使用foreach循环来设置会话变量。我明白这不安全。 function maintainUsers(){

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

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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中的会话没有问题。

答案 2 :(得分:1)

我怀疑会话没有开始。我过去曾遇到过类似的问题,发现会议首先没有开始。

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

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

答案 3 :(得分:0)

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

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

session_start();

viewUsers.php

的开头

如果不是上述情况,那么您当前的页面(执行.load()功能的那个)正在重置会话并篡改这些值。除非你上传代码或找到它,否则没有解决方案。

答案 4 :(得分:0)

你在php open标签之前有一些空格。他们将输出发送到浏览器,因此会话无法启动。

答案 5 :(得分:0)

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

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

?>