PHP Session-Variablen tragen über nicht auf meiner Seite in angemeldet, aber Sitzungs-ID ist

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

Frage

Ich bin mit PHP 4.3.9, Apache / 2.0.52

Ich versuche, ein Login-System zum Laufen zu bringen, die DB-Werte in einer Sitzung registriert, wo sie in einmal angemeldet verfügbar sind. Ich verliere die Session-Variablen, wenn ich umgeleitet bin .

Ich verwende den folgenden Code, um die Session-ID / Werte auf der Anmeldungsformularseite und die umgeleitete Seite zu drucken:

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

Dies ist, was in meinem Browser aus meiner Login-Seite gedruckt ist (ich kommentieren Sie nur die Header-Umleitung auf die in Seite angemeldet). Das ist die richtigen Informationen meiner DB als auch kommen, so ist alles in Ordnung an dieser Stelle .

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

Dies ist, was in Seite auf meinem umgeleitet / angemeldet gedruckt ist (wenn ich Kommentar- des Kopf- / Redirect). Session-ID ist die gleiche , aber ich bekomme keine Werte für die einzelnen Session-Variablen.

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

Ich erhalte die folgenden Fehler:

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

Ich habe eine globale header.php Datei, die meine loggedIN.php nicht nennen, obwohl loggedOUT.php tut - die Sitzung auf Toast):

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

Ihr loggedIN.php tut nichts, aber starten Sie die Sitzung

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

Die Logik meines Login-Skript , die Schlüsselrolle zu sein ich die DB Ergebnisse bin Holen rechts in $ _SESSION (etwa auf halbem Weg nach unten):

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

wenn ich die Header Umleitung auf der Login-Seite kommentieren Sie, kann ich das $ _SESSION Variablen mit den richtigen Informationen aus dem DB Echo aus. Sobald auf der Login-Seite umgeleitet, aber sie sind weg / ungesetzt.

Wer irgendwelche Ideen? Ich habe fast den ganzen Tag dafür ausgegeben und kann nicht sagen, ich bin näher es um herauszufinden.

BTW, ich habe vor kurzem zwei einfache Testseiten, eine eine Sitzung gestartet wird, setzen einige Variablen auf sie, hatte ein Formular, das auf einer zweiten Seite umgeleitet, die nichts tat, aber lesen / Ausgabe der Sitzung Vars. Es scheint alles in Ordnung zu arbeiten, ich bin nur Probleme mit etwas mit mir in meinem Haupt-App tun.

War es hilfreich?

Lösung

Ich habe keinen session_start() in Ihrer Login-Skript sehen. Wenn Sie nicht die Sitzung beginnen, glaube ich nicht, php alle Daten speichern werden Sie in der $_SESSION Array platzieren. Auch sicher sein, ich explizit Variablen in die $_SESSION Array platzieren würde, anstatt nur das Ganze mit $_SESSION = mysql_fetch_array($result); überschrieben wird.

Andere Tipps

Versuchen Sie, ein

session_regenerate_id(true); 

vor dem

session_write_close();

Auch. Der beste Weg, IMO ein Login-Skript zu tun, ist dies:

Lassen Sie die Login-Logik innerhalb der Startseite behandelt der Benutzer zuzugreifen versucht.

  1. Wenn der Benutzer nicht authentifiziert ist, wird er wieder auf die Login-Seite geworfen
  2. Wenn der Benutzer authentifiziert ist, erhält er ein $ _SESSION [ "Auth"] oder etwas
  3. Dann, wenn der Benutzer die Hauptseite oder anderen Seiten surft, die Auth müssen sie nur prüfen, ob die $ _SESSION [ „Auth“] eingestellt ist.

Dann haben Sie nicht die Mühe der Sitzung nicht kurz vor einer Umleitung Speicher

... kann ich zu den anderen Antworten hinzufügen, dass session_start () manchmal versagt oder seltsame Dinge treten auf, wenn nicht auf dem ersten Anfang des Skripts platziert. In Ihrer Header-Skript, versuchen Sie:

Anstelle von

<?php
ob_start();
session_start();

Setzen Sie

<?php
session_start();
ob_start();

Ich habe ein ähnliches Problem, wenn ich das entdeckt:

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

Sie haben den session_start zu setzen (); vor jedem HTML-Tags

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top