Las variables de sesión de PHP no se transfieren a mi página de inicio de sesión, pero el ID de sesión es

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

Pregunta

Estoy usando PHP 4.3.9, Apache / 2.0.52

Estoy tratando de hacer que funcione un sistema de inicio de sesión que registre los valores de la base de datos en una sesión donde estén disponibles una vez que inicie sesión. Estoy perdiendo las variables de la sesión una vez que soy redirigido .

Estoy usando el siguiente código para imprimir el ID / valores de sesión en mi página de formulario de inicio de sesión y la página redirigida:

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

Esto es lo que está impreso en mi navegador desde mi página de inicio de sesión (solo comento el redireccionamiento del encabezado a la página de inicio de sesión). Esta es la información correcta que proviene de mi base de datos también, así que todo está bien en este punto .

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

Esto es lo que se imprime en mi página redirigida / conectada (cuando descomento el encabezado / redireccionamiento). La ID de sesión es la misma , pero no obtengo valores para las variables de sesión individuales.

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

Recibo los siguientes errores:

Índice indefinido: nombre_nombre
Índice no definido: user_id
Índice no definido: user_level

Tengo un archivo global header.php al que no se llama mi loginIN.php, aunque logOUT.php sí, para brindar por la sesión):

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

Mi loginIN.php no hace nada más que iniciar la sesión

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

La lógica de mi script de inicio de sesión , la parte clave es que estoy obteniendo los resultados de la base de datos directamente en $ _SESSION (aproximadamente a la mitad):

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

si comento el redireccionamiento del encabezado en la página de inicio de sesión, puedo hacer eco de las variables $ _SESSION con la información correcta de la base de datos. Sin embargo, una vez redirigidos a la página de inicio de sesión, se han ido / desarmado.

¿Alguien tiene alguna idea? He pasado casi todo el día en esto y no puedo decir que estoy más cerca de resolverlo.

Por cierto, recientemente hice 2 páginas de prueba simples, una comenzó una sesión, configuré algunas variables, tuve un envío de formulario que redirigió a una segunda página que no hizo nada más que leer / imprimir los vars de la sesión. Todo parece funcionar bien, solo estoy teniendo problemas con algo que estoy haciendo en mi aplicación principal.

¿Fue útil?

Solución

No veo un session_start() en su secuencia de comandos de inicio de sesión. Si no está iniciando la sesión, no creo que php guarde los datos que coloque en la matriz $_SESSION. Además, para estar seguro, colocaría explícitamente las variables en la matriz $_SESSION = mysql_fetch_array($result); en lugar de sobrescribir todo con <=>.

Otros consejos

Intenta hacer un

session_regenerate_id(true); 

antes del

session_write_close();

También. La mejor forma en que IMO puede hacer un script de inicio de sesión es esta:

Permita que la lógica de inicio de sesión se maneje dentro de la página principal a la que el usuario está intentando acceder.

  1. Si el usuario no está autenticado, lo devuelven a la página de inicio de sesión
  2. Si el usuario está autenticado, obtiene $ _SESSION [" auth "] o algo
  3. Luego, cuando el usuario navega por la página principal u otras páginas que necesitan autenticación, simplemente verifican si $ _SESSION [" auth "] está configurado.

Entonces no tendrá el problema de que la sesión no se guarde justo antes de una redirección

... puedo agregar a las otras respuestas, que session_start () a veces falla o ocurren cosas extrañas si no se colocan en el primer comienzo del script. En su script de encabezado, intente:

En lugar de

<?php
ob_start();
session_start();

Poner

<?php
session_start();
ob_start();

Estaba teniendo un problema similar cuando descubrí esto:

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

TIENES QUE poner el session_start (); antes de CUALQUIER etiqueta html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top