Идентификатор сеанса PHP тот же, но переменные потеряны

У меня есть страница входа, которая устанавливает переменные сеанса при успешном входе в систему. Затем страница входа перенаправляет на страницу администратора. Страница администратора может нормально читать переменные сеанса. Но когда я выполняю функцию jQuery load(), которая загружает viewUsers.php в div содержимого, переменные сеанса исчезают. Странная часть заключается в том, что идентификатор сеанса тот же.

Я использовал var_dump() как на странице администратора, так и на странице viewUsers. Страницы администратора показывают все правильные переменные со страницы входа, но страница viewUsers, которая вызывается с помощью функции jQuery load() var_dump из $_SESSION, пуста. var_dump из $_COOKIE['PHPSESSID'] имеет правильный идентификатор, но для меня это не имеет никакого смысла.

Вот как я устанавливаю переменные сеанса.

$_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().

Некоторые переменные сеанса теряются, хотя у меня есть правильный идентификатор сеанса. Если бы кто-нибудь мог пролить свет на это, я был бы очень признателен!

На данный момент я заполняю скрытые поля и использую функцию публикации вместо загрузки, чтобы обойти это. Я понимаю, что это не лучший способ, но это единственный способ понять, как это сделать.

Редактировать: это верхняя часть индекса, который отлично читает переменные сеанса.

 <?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>

Другое редактирование: вот код javascript для загрузки пользователей просмотра. Единственная причина, по которой я использую сообщение, заключается в том, что я устанавливаю переменные сеанса как скрытые поля для передачи переменных сеанса. На пользователях просмотра я использую цикл foreach для установки переменных сеанса. Я понимаю, что это небезопасно. функция поддерживать пользователей () {

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

person Nick    schedule 29.04.2011    source источник
comment
вам задавали тот же вопрос до stackoverflow.com/questions/5721083/   -  person diEcho    schedule 29.04.2011
comment
@diEcho чувак, он не получил ответа, поэтому переспросил. Новый человек может заниматься такой деятельностью. Поэтому мы должны ответить ему, а не перенаправлять его   -  person Awais Qarni    schedule 29.04.2011
comment
@Ник, а как насчет viewUsrs.php. Вы также начинаете сеанс в этом файле/   -  person Awais Qarni    schedule 29.04.2011
comment
@Ник, ты проверял $userInfo[] ‹‹=== что-нибудь возвращал ??   -  person Eric T    schedule 29.04.2011
comment
@awais нет, он должен отредактировать свой старый вопрос. Это не правильное поведение.   -  person Jeff Atwood    schedule 29.04.2011
comment
Да, я задавал тот же вопрос, но я не знал, увидят ли его, если я его отредактирую. Я набрал новый вопрос, чтобы он был вверху, и люди его видели. Спасибо! :)   -  person Nick    schedule 29.04.2011
comment
@Ник, редактирующий вопрос, натыкается на него.   -  person Belinda    schedule 29.04.2011
comment
Я не понял этого, спасибо за разъяснение!   -  person Nick    schedule 30.04.2011
comment
Если ваш session_id такой же, можете ли вы также проверить, что файл cookie сеанса имеет правильный PATH?   -  person Dalibor Filus    schedule 11.12.2011


Ответы (6)


Может быть, это далеко не так, но используете ли вы какой-либо фреймворк или CMS? Я знаю, что wordpress удалит переменные сеанса (http://blog.ginchen.de/en/2008/08/15/session-variablen-in-wordpress/), можете ли вы показать код javascript, который вы используете для загрузки viewUsers? Вы программируете на локальном сервере?

person David Nguyen    schedule 03.05.2011
comment
Я использую jQuery и не использую CMS. Я добавил код javascript. Да, я программирую на локальном сервере. Я использую xampp. Спасибо за помощь! :) - person Nick; 04.05.2011

Если вы получили правильный $_COOKIE['PHPSESSID'], попробуйте добавить назначение session_id() перед session_start() следующим образом:

<?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.

person Max Barnas    schedule 20.05.2011

У вас есть пробелы перед открытым тегом php. Они отправляют вывод в браузер, и поэтому сеанс не запускается.

person beerwin    schedule 02.09.2011
comment
забыл написать, уберите эти пробелы - person beerwin; 02.09.2011
comment
Этот дополнительный пробел можно просто добавить при вставке текста сюда. Также пробел перед session_start() вызовет предупреждения. - person Dalibor Filus; 11.12.2011

Я подозреваю, что сеанс не запускается. У меня были подобные проблемы в прошлом, чтобы узнать, что сеанс не был запущен в первую очередь.

Вопрос: вы пытались распечатать значение в переменной сеанса, чтобы убедиться, что оно есть? :

Перед вызовом страницы и после вызова страницы.

person D. Rattansingh    schedule 11.12.2011
comment
Аааа - я знаю, что это старо, но это решило мою проблему. Спасибо! - person thebarless; 10.08.2014

Обычно такая ошибка возникает, когда вы не используете session_start() для чтения данных сеанса.

Попробуйте разместить (хотя вы сказали, что да, я бы посоветовал перепроверить)

session_start();

В начале вашего viewUsers.php

В случае, если это не так, ваша текущая страница (та, с которой вы выполняете функцию .load()) сбрасывает сеанс и подделывает значения. Если вы не загрузите код или не узнаете его, в этом случае нет решения.

person Starx    schedule 29.04.2011
comment
Опять же, мы могли бы ответить лучше, если бы вы также загрузили код своего viewUsers.php. - person Starx; 29.04.2011
comment
Спасибо, я ценю ваш ответ, но я уже сделал это и дважды проверил :). - person Nick; 29.04.2011
comment
@ Ник, твой viewUsers.php не мешает сеансу. возможно, страница, с которой вы выполняете функцию .load(), что-то делает. Пожалуйста, загрузите также код этой страницы. - person Starx; 30.04.2011
comment
Я имел в виду всю страницу, а не только часть js. - person Starx; 04.05.2011

Я бы предложил что-то простое. Включите это в КАЖДЫЙ файл.

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

?>
person iceduck    schedule 06.02.2012