Le variabili di sessione PHP non vengono trasferite alla mia pagina di accesso, ma lo è l'ID sessione

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

Domanda

Sto usando PHP 4.3.9, Apache / 2.0.52

Sto cercando di far funzionare un sistema di accesso che registra i valori DB in una sessione in cui sono disponibili una volta effettuato l'accesso. Perdo le variabili di sessione dopo essere stato reindirizzato .

Sto usando il seguente codice per stampare l'ID / i valori della sessione sulla mia pagina del modulo di accesso e sulla pagina reindirizzata:

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

Questo è ciò che è stampato nel mio browser dalla mia pagina di accesso (ho solo commentato il reindirizzamento dell'intestazione alla pagina di accesso). Questa è anche l'informazione corretta proveniente dal mio DB, quindi tutto va bene a questo punto .

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

Questo è ciò che è stampato sulla mia pagina reindirizzata / registrata (quando decomprimo l'intestazione / reindirizzamento). L'ID sessione è lo stesso , ma non ottengo valori per le singole variabili di sessione.

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

Ottengo i seguenti errori:

Indice indefinito: first_name
Indice indefinito: user_id
Indice non definito: livello_utente

Ho un file header.php globale che il mio loginIN.php NON chiama, anche se loggOUT.php lo fa - per brindare alla sessione):

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

Il mio loggIN.php non fa altro che avviare la sessione

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

La logica del mio script di accesso , essendo la parte chiave che sto recuperando i risultati del DB in $ _SESSION (circa a metà):

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 commento il reindirizzamento dell'intestazione nella pagina di accesso, posso echeggiare le variabili $ _SESSION con le informazioni giuste dal DB. Una volta reindirizzati alla pagina di accesso, tuttavia, sono andati / non impostati.

Qualcuno ha qualche idea? Ho trascorso quasi tutto il giorno su questo e non posso dire di essere più vicino a capirlo.

A proposito, di recente ho creato 2 semplici pagine di test, una ha avviato una sessione, ha impostato alcune variabili su di essa, ha avuto un modulo di invio che ha reindirizzato a una seconda pagina che non ha fatto altro che leggere / emettere le sessioni var. Sembra tutto a posto, sto solo avendo problemi con qualcosa che sto facendo nella mia app principale.

È stato utile?

Soluzione

Non vedo un session_start() nel tuo script di accesso. Se non stai avviando la sessione, non credo che php salverà tutti i dati inseriti nell'array $_SESSION. Inoltre, per sicurezza, inserisco esplicitamente le variabili nell'array $_SESSION = mysql_fetch_array($result); invece di sovrascrivere l'intera cosa con <=>.

Altri suggerimenti

Prova a fare un

session_regenerate_id(true); 

prima del

session_write_close();

Anche. Il modo migliore IMO per eseguire uno script di accesso è questo:

Consenti alla logica di accesso di essere gestita nella pagina principale a cui l'utente sta tentando di accedere.

  1. Se l'utente non è autenticato, viene riportato alla pagina di accesso
  2. Se l'utente è autenticato, ottiene $ _SESSION [" auth "] o qualcosa
  3. Quindi, quando l'utente sta visitando la pagina principale o altre pagine che necessitano di autenticazione, controllano solo se $ _SESSION [" auth "] è impostato.

Quindi non avrai il problema di non salvare la sessione appena prima di un reindirizzamento

... posso aggiungere alle altre risposte, che session_start () a volte fallisce o si verificano cose strane se non collocate al primo inizio dello script. Nello script dell'intestazione, prova:

Invece di

<?php
ob_start();
session_start();

Mettere

<?php
session_start();
ob_start();

Stavo riscontrando un problema simile quando ho scoperto questo:

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

DEVI inserire session_start (); prima di QUALSIASI tag html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top