Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Utrata sesji przy przekierowaniu.
Forum PHP.pl > Forum > PHP
artuross
Mam taki problem, że po zalogowaniu ustawiam w sesji loggedIn na 1, id, login i hash, następnie przekierowuje mnie do strony /index, gdzie najpierw zostaje sprawdzona poprawność danych (czyli sprawdza, czy taki użytkownik istnieje w bazie danych i czy w ogóle w sesji istnieje użytkownik), jeżeli istnieje, to idzie dalej, jeżeli nie istnieje lub użytkownik nie jest zalogowany to czyści sesję i ustawia loggedIn na 0.

Więc idąc po kolei, wysyłanie formularza wywołuje metodę run()
  1. class Login extends Model
  2. {
  3. function __construct( )
  4. {
  5. parent::__construct( );
  6. $this->checkIfLoggedIn( );
  7. }
  8.  
  9. function run( $data )
  10. {
  11. $sth = $this->db->prepare( 'SELECT `uID`, `uLogin`, `uPassword` FROM `users` WHERE
  12. `uLogin` = :login AND `uPassword` = :password' );
  13. foreach ( $data as $key => $value )
  14. {
  15. $sth->bindValue( ':' . $key, $value );
  16. }
  17. $sth->execute( );
  18. $data = $sth->fetchAll( PDO::FETCH_ASSOC );
  19.  
  20. if ( count( $data ) > 0 )
  21. {
  22. $_SESSION[ 'loggedIn' ] = 1;
  23.  
  24. $_SESSION[ 'userID' ] = $data[ 0 ][ 'uID' ];
  25. $_SESSION[ 'userLogin' ] = $data[ 0 ][ 'uLogin' ];
  26. $_SESSION[ 'userPass' ] = $data[ 0 ][ 'uPassword' ];
  27.  
  28. header( 'Location: /strona/index' );
  29. exit();
  30.  
  31. }
  32. else
  33. {
  34. $_SESSION[ 'loggedIn' ] = 0;
  35. header( 'Location: /strona/login' );
  36. exit();
  37. }
  38. }
  39. }



Klasa Model:
  1. class Model
  2. {
  3. function __construct( )
  4. {
  5. $this->db = new Database( );
  6. }
  7.  
  8. protected function checkIfLoggedIn( )
  9. {
  10. if ( isset( $_SESSION[ 'loggedIn' ] ) == false )
  11. {
  12. unset( $_SESSION );
  13. $_SESSION[ 'loggedIn' ] = 0;
  14. return false;
  15. }
  16.  
  17. if ( $_SESSION[ 'loggedIn' ] == 0 )
  18. {
  19. unset( $_SESSION );
  20. $_SESSION[ 'loggedIn' ] = 0;
  21. return false;
  22. }
  23.  
  24. if ( !isset( $_SESSION[ 'userID' ] ) )
  25. {
  26. unset( $_SESSION );
  27. $_SESSION[ 'loggedIn' ] = 0;
  28. return false;
  29. }
  30.  
  31. if ( !isset( $_SESSION[ 'userLogin' ] ) )
  32. {
  33. unset( $_SESSION );
  34. $_SESSION[ 'loggedIn' ] = 0;
  35. return false;
  36. }
  37.  
  38. if ( !isset( $_SESSION[ 'userPass' ] ) )
  39. {
  40. unset( $_SESSION );
  41. $_SESSION[ 'loggedIn' ] = 0;
  42. return false;
  43. }
  44.  
  45. if ( $this->getLoginFromDB( ) == false )
  46. {
  47. unset( $_SESSION );
  48. $_SESSION[ 'loggedIn' ] = 0;
  49. return false;
  50. }
  51. }
  52.  
  53. protected function getLoginFromDB( )
  54. {
  55. $sth = $this->db->prepare( 'SELECT `uID`, `uLogin`, `uPassword` FROM users WHERE
  56. `uID` = :id AND `uLogin` = :login AND `uPassword` = :pass' );
  57. $sth->execute( array(
  58. ':id' => $_SESSION[ 'userID' ],
  59. ':login' => $_SESSION[ 'userLogin' ],
  60. ':pass' => $_SESSION[ 'userPass' ]
  61. ) );
  62.  
  63. $data = $sth->fetchAll( );
  64. if ( count( $data ) > 0 )
  65. {
  66. return true;
  67. }
  68. return false;
  69. }
  70. }


A tutaj ostatnia klasa, Index, wykonuje funkcję index():
  1. class Index extends Model
  2. {
  3. function __construct( )
  4. {
  5. parent::__construct( );
  6. $this->checkIfLoggedIn( );
  7. }
  8.  
  9. function index( )
  10. {
  11. if ( $_SESSION[ 'loggedIn' ] != 0 )
  12. {
  13. // wykonuj
  14. }
  15. else
  16. {
  17. return false;
  18. }
  19. }
  20.  
  21. }


I teraz nie wiem w czym polega problem, bo logika działania jest OK (każdy krok wykonywałem po kolei, przerywając wykonywanie skryptu i działało, ale jak już puszczę całość to się wysypuje). session_start() jest wywoływane na początku pliku index.php (innymi słowy: jest wykonywane zawsze).
Wiecie może jak zaradzić traceniu sesji?
L00zak
dodaj po session_start(); session_set_cookie_params(0, '/', 'www.nazwadomeny.pl'); i sprawdź

artuross
Nie działa :/
acidm
Sesje w całości usuwaj za pomocą session_unset() a nie unset($_SESSION).
Gdy chcesz usuwać pojedyńcze wartości z sesji to unset() się nada , dla calej nie.


Ps. session_set_cookie_params() używa się przed wywołaniem session_start().
artuross
Hmm... wygląda na to, że działa, naprawdę Ci dziękuję, myślałem, że między session_unset() a unset($_SESSION) nie ma żadnej różnicy.
L00zak
Cytat(acidm @ 29.12.2012, 18:09:36 ) *
Ps. session_set_cookie_params() używa się przed wywołaniem session_start().


zgadza się, dzięki za poprawienie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.