PHP переменные сессии, которые не несут в мой вход в страницу, но идентификатор сеанса

голоса
5

Я использую 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 является то же самое , но я не получаю значения для отдельных переменных сеанса.

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

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

Undefined индекс: first_name
Undefined индекс: user_id
Undefined индекс: 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>

Логика моего сценария входа , ключевая часть того , что я извлечение БД приводит прямо в $ _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 с правой информации из БД. После перенаправлены на страницу входа в систему, однако, они ушли / снята с охраны.

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

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

Задан 06/01/2009 в 01:10
источник пользователем
На других языках...                            


4 ответов

голоса
7

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

Ответил 06/01/2009 в 01:26
источник пользователем

голоса
3

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

session_regenerate_id(true); 

перед

session_write_close();

Также. Лучший способ ИМО сделать сценарий входа это:

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

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

Тогда вы не будете иметь неприятности сессии не экономить как раз перед перенаправлением

Ответил 06/01/2009 в 01:16
источник пользователем

голоса
0

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

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

Вы должны поставить session_start (); прежде чем любой HTML-теги

Ответил 05/11/2016 в 19:00
источник пользователем

голоса
0

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

Вместо

<?php
ob_start();
session_start();

Положил

<?php
session_start();
ob_start();
Ответил 03/07/2016 в 19:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more