variáveis ??de sessão PHP não transportem mais ao meu logado página, mas ID da sessão é

StackOverflow https://stackoverflow.com/questions/415005

Pergunta

Eu estou usando PHP 4.3.9, Apache / 2.0.52

Eu estou tentando obter um sistema de login de trabalho que valorize registros DB em uma sessão onde eles estão disponíveis uma vez logado. Eu estou perdendo as variáveis ??de sessão uma vez que eu sou redirecionado .

Eu estou usando o seguinte código para imprimir o ID da sessão / valores na minha página de formulário de login e a página redirecionada:

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>';

Este é o que está impresso no meu navegador de minha página de login (eu apenas comentar o redirecionamento de cabeçalho à logado página). Esta é a informação correta vindo do meu DB, bem, então tudo está bem neste momento .

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

Este é o que está impresso na minha redirecionado / logado página (quando eu tire o cabeçalho / redirecionamento). Session ID é o mesmo , mas eu não obter valores para as variáveis ??de sessão individual.

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

Eu recebo os seguintes erros:

Undefined index: first_name
Undefined index: user_id
Undefined index: user_level

Eu tenho um mundial header.php arquivo que minha loggedIN.php não chama, embora loggedOUT.php faz - para brindar a sessão):

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

Meu loggedIN.php não faz nada mas começar a sessão

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

O lógica do meu script de login , a parte fundamental de ser eu estou buscando o DB resulta para a direita em $ _SESSION (cerca de meio caminho para baixo):

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'])

se eu comentar o redirecionamento de cabeçalho na página de login, posso eco fora $ _SESSION variáveis ??com a informação certa a partir do DB. Uma vez redirecionado para a página de login, no entanto, eles se foram / unset.

Alguém tem alguma idéia? Eu passei quase o dia todo sobre isso e não posso dizer que estou mais perto de descobrir isso.

BTW, eu recentemente fez 2 páginas de teste simples, um começou uma sessão, definir algumas variáveis ??sobre ele, tinha um formulário de envio que redirecionado para uma segunda página que não fez nada, mas ler / saída da sessão Vars. Tudo parece funcionar bem, só estou tendo problemas com algo que eu estou fazendo em meu aplicativo principal.

Foi útil?

Solução

Eu não ver um session_start() no seu script de login. Se você não estiver começando a sessão eu não acho que php irá salvar todos os dados que colocar na matriz $_SESSION. Também para ser seguro eu tinha explicitamente variáveis ??colocar na matriz $_SESSION em vez de apenas substituir a coisa toda com $_SESSION = mysql_fetch_array($result);.

Outras dicas

Tente fazer um

session_regenerate_id(true); 

antes do

session_write_close();

Também. A melhor maneira IMO fazer um login script é o seguinte:

Deixe a lógica de login ser tratadas no mainpage o usuário está tentando acessar.

  1. Se o usuário não estiver autenticado, ele é jogado de volta para a página de login
  2. Se o usuário é autenticado, ele recebe um $ _SESSION [ "auth"] ou algo
  3. Em seguida, quando o usuário está navegando na página principal ou outras páginas que necessidade auth, apenas verificar se o $ _SESSION [ "auth"] está definido.

Em seguida, você não terá o problema de sessão não poupando pouco antes um redirecionamento

... Posso acrescentar às outras respostas, que session_start () às vezes falha ou coisas estranhas ocorre se não colocado no primeiro início do script. No seu script de cabeçalho, tente:

Em vez de

<?php
ob_start();
session_start();

Coloque

<?php
session_start();
ob_start();

Eu estava tendo um problema semelhante quando eu descobri isto:

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

Você tem que colocar o session_start (); Antes de qualquer html tag

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top