2009-01-06 3 views
5

Ich verwende PHP 4.3.9, Apache/2.0.52PHP Session-Variablen tragen zu meiner nicht in Seite angemeldet, aber Sitzungs-ID ist

Ich versuche, ein Login-System zum Laufen zu bringen, dass DB-Werte werden in einer Sitzung registriert, in der sie nach der Anmeldung verfügbar sind. Ich verliere die Sitzungsvariablen, nachdem ich umgeleitet wurde.

ich den folgenden Code bin mit den Sitzungs-ID/Werten auf der Anmeldungsformularseite und die umgeleitete Seite 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 gerade Kommentar out the header redirect auf die eingeloggte Seite). Dies ist die korrekte Information, die auch von meiner DB kommt, also ist alles in Ordnung.

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

Dies ist, was auf meiner umgeleiteten/eingeloggten Seite gedruckt wird (wenn ich die Überschrift/redirect auskommentiere). Sitzungs-ID ist das gleiche, aber ich bekomme keine Werte für die einzelnen Sitzungsvariablen.

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

ich folgende Fehler:

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

Ich habe eine globale header.php Datei, die meine loggedIN.php ruft nicht auf, obwohl loggedOUT.php - um die Sitzung zu rösten -:

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 

Mein 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 Anmeldeskript, der Schlüsselteil ich holen sein der DB ergibt sich direkt in $ _SESSION (ungefähr zur Hälfte):

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 Anmeldeseite auskommentiere, kann ich die $ _SESSION-Variablen mit den richtigen Informationen aus der DB aussprechen. Sobald sie auf die Anmeldeseite umgeleitet wurden, sind sie jedoch nicht mehr verfügbar.

Wer hat irgendwelche Ideen? Ich habe fast den ganzen Tag damit verbracht und kann nicht sagen, dass ich näher dran bin, es herauszufinden.

BTW, ich habe vor kurzem zwei einfache Testseiten, begann man eine Sitzung, 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 gut zu funktionieren, ich habe nur Probleme mit etwas, was ich in meiner Haupt-App mache.

Antwort

7

ich ein session_start() in Ihrem Login-Skript nicht sehen zu speichern. Wenn Sie die Sitzung nicht starten, glaube ich nicht, dass php alle Daten speichert, die Sie im $_SESSION Array ablegen. Auch um sicher zu sein, würde ich Variablen explizit in das Array $_SESSION platzieren, anstatt nur das Ganze mit $_SESSION = mysql_fetch_array($result); zu überschreiben.

+0

Hey Wenn Sie die DB-Werte manuell in das $ _SESSION-Array setzen, sieht das so aus, als wäre es der Trick. Vielen Dank! Liegt es daran, dass ich PHP 4.3.9 verwende? –

+2

4.3.9 ist alt. – jmucchiello

+1

@magenta Ich denke, das liegt daran, dass man $ _SESSION = array (...) * das * _SESSION-Objekt nicht modifiziert, sondern stattdessen die Referenz wegwirft und durch etwas anderes ersetzt. Und ja, 4.3.9 ist auch ziemlich alt :) – redShadow

3

Try a

session_regenerate_id(true); 

vor dem

session_write_close(); 

Auch

tun. Der beste Weg, ein IMO-Anmeldeskript auszuführen, ist dies:

Lassen Sie die Login-Logik innerhalb der Hauptseite gehandhabt werden, auf die 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 Wenn Sie die Hauptseite oder andere Seiten durchsuchen, die Auth benötigen, überprüfen Sie einfach, ob $ _SESSION ["auth"] gesetzt ist.

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

+0

Dies ist eine gute Antwort! –

+0

Vielen Dank:) –

+0

Die Logik meines Anmeldeskripts basiert darauf unter http://stackoverflow.com/questions/1270005/to-set-up-a-login-system-by-sessions-in-php –

0

... kann ich zu den anderen Antworten hinzufügen, dass session_start() manchmal fehlschlägt oder seltsame Dinge passieren, wenn sie nicht am allerersten Anfang des Skripts platziert werden. In Ihrem Header-Skript, versuchen:

Statt

<?php 
ob_start(); 
session_start(); 

Put

<?php 
session_start(); 
ob_start(); 
Verwandte Themen