Переменные сеанса PHP не переносятся на мою зарегистрированную страницу, но идентификатор сеанса

Я использую PHP 4.3.9, Apache / 2.0.52

Я пытаюсь получить систему входа в систему, которая регистрирует значения БД в сеансе, где они доступны после входа в систему. Я теряю переменные сеанса, как только я перенаправлен .

Я использую следующий код для печати идентификаторов / значений сеанса на моей странице формы входа и перенаправленной странице:

echo '<font color="red">session id:</font> ' . session_id() . '<br>'; echo '<font color="red">session first name:</font> ' . $_SESSION['first_name'] . '<br>'; echo '<font color="red">session user id:</font> ' . $_SESSION['user_id'] . '<br>'; echo '<font color="red">session user level:</font> ' . $_SESSION['user_level'] . '<br><br>'; 

Это то, что напечатано в моем браузере с моей страницы входа (я просто комментирую перенаправление заголовка на страницу входа). Это правильная информация, поступающая из моей БД, так что все в порядке .

 session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc session first name: elvis session user id: 2 session user level: 1 

Это то, что напечатано на моей перенаправленной / зарегистрированной странице (когда я раскомментирую заголовок / перенаправление). Идентификатор сеанса один и тот же , но я не получаю никаких значений для отдельных переменных сеанса.

 session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc session first name: session user id: session user level: 

Я получаю следующие ошибки:

Неопределенный индекс: first_name
Неопределенный индекс: user_id
Неопределенный индекс: user_level

У меня есть глобальный файл header.php, который мой loggedIN.php НЕ вызывает, хотя loggedOUT.php делает – для тоста сессии):

header.php

 <?php ob_start(); session_start(); //if NOT on loggedout.php, check for cookie. if exists, they haven't explicity logged out so take user to loggedin.php if (!strpos($_SERVER['PHP_SELF'], 'loggedout.php')) { /*if (isset($_COOKIE['access'])) { header('Location: www.mydomain.com/loggedin.php'); }*/ } else { //if on loggedout.php delete cookie //setcookie('access', '', time()-3600); //destroy session $_SESSION = array(); session_destroy(); setcookie(session_name(), '', time()-3600); } //defines constants and sets up custom error handler require_once('config.php'); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> some page layout stuff Login portion is eventually called via include footer stuff 

Мой loggedIN.php ничего не делает, кроме начала сеанса

 <?php session_start(); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

Логика моего сценария входа в систему , ключевая часть которой я получаю результаты DB прямо в $ _SESSION (примерно на полпути вниз):

 if (isset($_POST['login'])) { //access db require_once(MYSQL); //initialize an errors array for non-filled out form fields $errors = array(); //setup $_POST aliases, clean for db and trim any whitespace $email = mysql_real_escape_string(trim($_POST['email']), $dbc); $pass = mysql_real_escape_string(trim($_POST['pass']), $dbc); if (empty($email)) { $errors[] = 'Please enter your e-mail address.'; } if (empty($pass)) { $errors[] = 'Please enter your password.'; } //if all fields filled out and everything is OK if (empty($errors)) { //check db for a match $query = "SELECT user_id, first_name, user_level FROM the rest of my sql here, blah blah blah"; $result = @mysql_query($query, $dbc) OR trigger_error("Query: $query\n<br />MySQL Error: " . mysql_error($dbc)); if (@mysql_num_rows($result) == 1) { //a match was made, OK to login //register the retrieved values into $_SESSION $_SESSION = mysql_fetch_array($result); mysql_free_result($result); mysql_close($dbc); /* setcookie('access'); //if "remember me" not checked, session cookie, expires when browser closes //in FF you must close the tab before quitting/relaunching, otherwise cookie persists //"remember me" checked? if(isset($_POST['remember'])){ //expire in 1 hour (3600 = 60 seconds * 60 minutes) setcookie('access', md5(uniqid(rand())), time()+60); //EXPIRES IN ONE MINUTE FOR TESTING } */ echo '<font color="red">cookie:</font> ' . print_r($_COOKIE) . '<br><br>'; echo '<font color="red">session id:</font> ' . session_id() . '<br>'; echo '<font color="red">session first name:</font> ' . $_SESSION['first_name'] . '<br>'; echo '<font color="red">session user id:</font> ' . $_SESSION['user_id'] . '<br>'; echo '<font color="red">session user level:</font> ' . $_SESSION['user_level'] . '<br><br>'; ob_end_clean(); session_write_close(); $url = BASE_URL . 'loggedin_test2.php'; header("Location: $url"); exit(); } else { //wrong username/password combo echo '<div id="errors"><span>Either the e-mail address or password entered is incorrect or you have not activated your account. Please try again.</span></div>'; } //clear $_POST so the form isn't sticky $_POST = array(); } else { //report the errors echo '<div id="errors"><span>The following error(s) occurred:</span>'; echo '<ul>'; foreach($errors as $error) { echo "<li>$error</li>"; } echo '</ul></div>'; } } // end isset($_POST['login']) 

если я прокомментирую перенаправление заголовка на странице входа, я могу выделить переменные $ _SESSION с правильной информацией из БД. Однако после перенаправления на страницу входа в систему они исчезли / отключены.

У кого-нибудь есть идеи? Я потратил почти весь день на это и не могу сказать, что я ближе к выяснению этого.

Кстати, недавно я сделал две простые тестовые страницы, один запустил сеанс, установил на нем некоторые переменные, имел форму submit, которая перенаправлялась на вторую страницу, которая ничего не делала, кроме чтения / вывода сеансовых варов. Кажется, все работает нормально, у меня просто проблемы с чем-то, что я делаю в своем основном приложении.

Я не вижу session_start() в вашем скрипте входа. Если вы не начинаете сессию, я не думаю, что php сохранит любые данные, которые вы поместите в массив $_SESSION . Кроме того, чтобы быть в безопасности, я бы явно $_SESSION = mysql_fetch_array($result); переменные в массив $_SESSION вместо того, чтобы просто переписывать все это с помощью $_SESSION = mysql_fetch_array($result); ,

Попробуйте сделать

 session_regenerate_id(true); 

перед

 session_write_close(); 

Также. Лучший способ, которым IMO выполняет сценарий входа в систему:

Позвольте логике логики обрабатываться в главной странице, к которой пользователь пытается получить доступ.

  1. Если пользователь не аутентифицирован, он возвращается на страницу входа в систему
  2. Если пользователь аутентифицирован, он получает $ _SESSION ["auth"] или что-то
  3. Затем, когда пользователь просматривает главную страницу или другие страницы, на которые требуется auth, они просто проверяют, установлен ли $ _SESSION ["auth"].

Тогда у вас не будет проблемы с сеансом, который не будет сохранен непосредственно перед перенаправлением

… могу ли я добавить к другим ответам, что session_start () иногда терпит неудачу или возникает странный материал, если он не помещен в самом первом начале скрипта. В своем сценарии заголовка попробуйте:

Вместо

 <?php ob_start(); session_start(); 

Положил

 <?php session_start(); ob_start(); 

У меня была аналогичная проблема, когда я обнаружил это:

http://www.w3schools.com/php/php_sessions.asp

Вы должны положить session_start (); перед ANY html-тегами