Я использую 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 выполняет сценарий входа в систему:
Позвольте логике логики обрабатываться в главной странице, к которой пользователь пытается получить доступ.
Тогда у вас не будет проблемы с сеансом, который не будет сохранен непосредственно перед перенаправлением
… могу ли я добавить к другим ответам, что session_start () иногда терпит неудачу или возникает странный материал, если он не помещен в самом первом начале скрипта. В своем сценарии заголовка попробуйте:
Вместо
<?php ob_start(); session_start();
Положил
<?php session_start(); ob_start();
У меня была аналогичная проблема, когда я обнаружил это:
http://www.w3schools.com/php/php_sessions.asp
Вы должны положить session_start (); перед ANY html-тегами