2009-01-06 7 views
5

Używam PHP 4.3.9, Apache/2.0.52zmienne sesji PHP nie przewożące do mojego zalogowanego w stronę, ale identyfikator sesji jest

Próbuję dostać pracę, że system logowania rejestruje wartości DB w sesji, w której są one dostępne po zalogowaniu. Tracę zmienne sesji po przekierowaniu.

Używam następujący kod do drukowania identyfikatorów sesji/wartości na mojej stronie formularza logowania i przekierowany na stronę:

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

To, co jest drukowane w przeglądarce z mojej strony logowania (I tylko komentarz out przekierowanie nagłówka do zalogowanej strony). To jest poprawna informacja pochodząca z mojego DB, więc wszystko jest w porządku w tym momencie.

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

To co wydrukowane na mój przekierowany/zalogowany stronie (kiedy odkomentuj nagłówka/przekierowanie). Identyfikator sesji jest taki sam, ale nie otrzymuję wartości dla poszczególnych zmiennych sesji.

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

otrzymuję następujące błędy:

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

mam globalnego header.php plik, który mój loggedIN.php NIE dzwoni, chociaż logowaneOUT.php robi - toast za sesję):

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 

My loggedIN.php nic nie robi, ale rozpocząć sesję

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

logika mojego skryptu logowania, kluczowym elementem jest ja ściągam wyniki z bazy danych mieszczą się w $ _SESSION (około połowy wysokości):

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

jeśli skomentuję przekierowanie nagłówka na stronie logowania, mogę wygenerować zmienne $ _SESSION z odpowiednimi informacjami z DB. Po przekierowaniu na stronę logowania są one jednak niedostępne.

Ktoś ma jakieś pomysły? Spędziłem prawie cały dzień na tym i nie mogę powiedzieć, że jestem bliżej, aby to rozgryźć.

BTW, Niedawno zrobiłem 2 proste strony testowe, jeden rozpoczął sesję, ustawił kilka zmiennych na niej, miał przesłany formularz, który przekierował na drugą stronę, która nic nie robiła, tylko odczyt/wypisanie zmiennych sesji. Wszystko wydaje się działać dobrze, mam tylko problemy z czymś, co robię w mojej głównej aplikacji.

Odpowiedz

7

ja nie widzę session_start() w skrypcie logowania. Jeśli nie rozpoczynasz sesji, nie sądzę, aby php zapisywał jakiekolwiek dane, które umieścisz w tablicy $_SESSION. Aby być bezpiecznym, jawnie wstawiłbym zmienne do tablicy $_SESSION, zamiast tylko nadpisywać całość za pomocą $_SESSION = mysql_fetch_array($result);.

+0

Hej , umieszczenie wartości DB ręcznie w tablicy $ _SESSION wygląda tak, jak powinno. Dzięki wielkie! Czy to dlatego, że utknąłem przy użyciu PHP 4.3.9? –

+2

4.3.9 jest starożytny. – jmucchiello

+1

@magenta Myślę, że to dlatego, że wykonanie $ _SESSION = array (...) * nie * zmodyfikuj obiektu $ _SESSION, zamiast tego wyrzuć referencję i zamień ją na coś innego. I tak, 4.3.9 też jest dość stary :) – redShadow

3

spróbować zrobić

session_regenerate_id(true); 

przed

session_write_close(); 

również. Najlepszym sposobem, aby IMO zrobił skrypt logowania, jest:

Pozwól logice logowania obsługiwać się na stronie głównej, do której użytkownik próbuje uzyskać dostęp.

  1. Jeśli użytkownik nie jest uwierzytelniony, jest on wrzucony z powrotem do strony logowania
  2. Jeżeli użytkownik jest uwierzytelniony, on dostaje $ _SESSION [ „auth”] lub coś
  3. wtedy, gdy użytkownik jest przeglądając stronę główną lub inne strony, które potrzebują auth, sprawdzają tylko, czy ustawiono $ _SESSION ["auth"].

Wtedy nie będziesz mieć kłopotów z sesji nie oszczędności tuż przed przekierowaniem

+0

To jest świetna odpowiedź! –

+0

Dziękuję:) –

+0

Logika mojego skryptu logowania oparta jest na http://stackoverflow.com/questions/1270005/to-set-up-a-login-system-by-sessions-in-php –

0

... mogę dodać do innych odpowiedzi, że session_start() czasami się nie udaje lub występują dziwne rzeczy, jeśli nie są umieszczone na samym początku skryptu. W skrypcie nagłówka, spróbuj:

Zamiast

<?php 
ob_start(); 
session_start(); 

Put

<?php 
session_start(); 
ob_start(); 
Powiązane problemy