Les variables de session PHP ne sont pas transférées sur ma page de connexion, mais l'ID de session est

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

Question

J'utilise PHP 4.3.9, Apache / 2.0.52

J'essaie de faire fonctionner un système de connexion qui enregistre les valeurs de base de données dans une session disponible une fois connecté. Je perds les variables de session une fois que je suis redirigé .

J'utilise le code suivant pour imprimer l'ID / les valeurs de session sur ma page de formulaire de connexion et la page redirigée:

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

C’est ce qui est imprimé dans mon navigateur depuis ma page de connexion (je mets un commentaire sur la redirection de l’en-tête vers la page de connexion). Il s'agit également des informations correctes provenant de ma base de données, donc tout va bien à ce stade .

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

C’est ce qui est imprimé sur ma page redirigée / connectée (lorsque je ne commente pas l’en-tête / la redirection). L'ID de session est identique , mais je ne reçois aucune valeur pour les variables de session individuelles.

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

Je reçois les erreurs suivantes:

Index non défini: prénom_nom
Index non défini: user_id
Index non défini: niveau_utilisateur

J'ai un fichier global header.php que mon logIN.php n'appelle PAS, bien que logOUT.php le fasse - pour griller la session):

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

Mon logIN.php ne fait que démarrer la session

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

La logique de mon script de connexion , l'élément clé étant l'extraction des résultats de la base de données directement dans $ _SESSION (à peu près à mi-chemin):

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 je commente la redirection d'en-tête sur la page de connexion, je peux faire écho aux variables $ _SESSION avec les bonnes informations de la base de données. Une fois redirigés vers la page de connexion, cependant, ils sont partis / non définis.

Quelqu'un a des idées? J'ai passé presque toute la journée à ce sujet et je ne peux pas dire que je suis plus près de le comprendre.

BTW, j’ai récemment fait 2 pages de test simples, une qui a démarré une session, défini des variables dessus, envoyé un formulaire qui a été redirigé vers une seconde page qui ne faisait que lire / afficher les vars de session. Tout semble bien fonctionner. J'ai juste des problèmes avec quelque chose que je fais dans mon application principale.

Était-ce utile?

La solution

Je ne vois pas de session_start() dans votre script de connexion. Si vous ne démarrez pas la session, je ne pense pas que php sauvegarde toutes les données que vous placez dans le tableau $_SESSION. De plus, par sécurité, je placerais explicitement des variables dans le tableau $_SESSION = mysql_fetch_array($result); au lieu de simplement écraser le tout avec <=>.

Autres conseils

Essayez de faire un

session_regenerate_id(true); 

avant le

session_write_close();

Aussi. Voici le meilleur moyen pour un script de connexion à l’OMI:

Laissez la logique de connexion être gérée dans la page principale à laquelle l'utilisateur tente d'accéder.

  1. Si l'utilisateur n'est pas authentifié, il est renvoyé à la page de connexion
  2. Si l'utilisateur est authentifié, il obtient un $ _SESSION [" auth "] ou quelque chose
  3. Ensuite, lorsque l'utilisateur navigue sur la page principale ou sur d'autres pages nécessitant une authentification, il vérifie simplement si $ _SESSION [& "auth &";] est défini.

Dans ce cas, vous n'aurez pas la peine de ne pas enregistrer votre session juste avant une redirection

... puis-je ajouter aux autres réponses que session_start () échoue parfois ou que des choses étranges se produisent si elles ne sont pas placées au tout début du script. Dans votre script d’en-tête, essayez:

Au lieu de

<?php
ob_start();
session_start();

Mettez

<?php
session_start();
ob_start();

J'avais un problème similaire quand j'ai découvert ceci:

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

Vous DEVEZ mettre le session_start (); avant TOUT balise HTML

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top