Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Session Handler problem z trzymaniem sesji na IE
Forum PHP.pl > Forum > Przedszkole
craker
Witam,
mam taki dosćnietypowy problem, napisałem sobie własny system sesji i na wszystkich przeglądarkach dziala dobrze tylko nie na IE. klikam zaloguj, pojawia się napis zostałeś zalogowany jako.. przechodzę na jakąś strone i już sesji nie mam. to nie wina kompa bo testowałem na 7 niezależnych kompach i 3 różnych łączach i to samo IE nie trzyma sesji. natomiast w Operze mam coś takiego czasami, że jak dam wyloguj, to przechodzi mi do formularzu logowania zamiast mnie wylogować

sesje działają tak:
w cookie zapisuje identyfikator sesji i czas utworzenia sesji, a session handler sprawdza czy zapisany w bazie jest taki hash, jeśli tak to czy IP, i przeglądarka się zgadza i czy nie upłynął czas trwania sesji. Jak mogę rozwiazać ten problem bo nie mam zupełnie pomysłu
kossa
Pokaż kod bo najprawdopodobniej coś sknociłeś smile.gif

Łukasz
Garrappachc
Może ustawiłeś i IE żeby nie obsługiwało cookie?...
craker
na początku też właśnie tak myślałem, ale ale dawalem nawet pełną akceptacje cookie i nic.

@kossa nie wiem, ale wydaje mi się, że jakbym coś sknocił to na FF czy operze też by nie działało, chyba, ze się mylę ?
moge dać kod ale popołudniu jak wrócę z pracy

mam takie pliki:

request.php
  1. <?php
  2. class httpRequest
  3. {
  4. private $ip;
  5. private $browser;
  6. public function __construct()
  7. {
  8. $this -> ip = $this->ip();
  9. $this -> browser = $_SERVER['HTTP_USER_AGENT'];
  10. } // end __construct();
  11. public function getIp()
  12. {
  13. return $this -> ip;
  14. } // end getIp();
  15. public function getBrowser()
  16. {
  17. return $this -> browser;
  18. } // end getBrowser();
  19. public function ip()
  20. {
  21. if($_SERVER['HTTP_X_FORWARDED_FOR'])
  22. {
  23. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  24. }
  25. else
  26. {
  27. $ip = $_SERVER['REMOTE_ADDR'];
  28. }
  29.  
  30. return $ip;
  31. }
  32. }
  33. ?>


user.php
  1. <?php
  2. class user
  3. {
  4. private $id;
  5. private $login;
  6. private $password;
  7. private $name;
  8. private $lastname;
  9. private $construct;
  10.  
  11. public function __construct($anonymous = true, $id = 0, $login = '', $password = '', $name = '', $lastname = '')
  12. {
  13. if($anonymous == true)
  14. {
  15. $this->id = 0;
  16. $this->login = '';
  17. $this->password = '';
  18. $this->name = '';
  19. $this->lastname = '';
  20. }
  21. else
  22. {
  23. $this->id = $id;
  24. $this->login = $login;
  25. $this->password = $password;
  26. $this->name = $name;
  27. $this->lastname = $lastname;
  28. }
  29.  
  30. $this -> construct = true;
  31. } // end __construct();
  32. public function isAnonymous()
  33. {
  34. return ($this->id == 0 ? true : false);
  35. } // end isAnonymous();
  36. public function getId()
  37. {
  38. return $this->id;
  39. } // end getId();
  40. public function getLogin()
  41. {
  42. return $this->login;
  43. } // end getLogin();
  44. public function getPassword()
  45. {
  46. return $this->password;
  47. } // end getPassword();
  48. public function getName()
  49. {
  50. return $this->name;
  51. } // end getName();
  52. public function getLastname()
  53. {
  54. return $this->lastname;
  55. } // end getLastname();
  56. public function __set($name, $value)
  57. {
  58. if(!$this->construct)
  59. {
  60. $this->$name = $value;
  61. }
  62. } // end __set();
  63. static public function checkPassword($login, $password)
  64. {
  65. global $db;
  66. $password = sha1($password);
  67. $stmt = $db->query('SELECT user_id AS `id`,
  68. user_mail AS `login`, user_pass AS `password`,
  69. user_name AS `name`, user_lastname AS `lastname`
  70. FROM users 
  71. WHERE user_mail = "' .$login. '" AND 
  72. user_pass = "' .$password. '"');
  73. if($db->num_rows())
  74. {
  75.  
  76. // Jezeli uzytkownik o takim loginie i hasle
  77. // istnieje, zwroc jego rekord w postaci obiektu
  78. $array = $db->fetch_row();
  79. $user = new user(false, $array['id'], $array['login'], $array['password'], $array['name'], $array['lastname']);
  80. return $user;
  81. }
  82. else
  83. {
  84. // Bledy w loginie/hasle zglaszamy zerem
  85. return 0;
  86. }
  87.  
  88. } // end checkPassword();
  89. }
  90. ?>


session.php
  1. <?php
  2.  
  3. define('COOKIE_NAME', 'bigtestsesssji'); // losowe
  4. define('COOKIE_EXPIRE', 3600); // 1 godzina
  5.  
  6. class session
  7. {
  8. private $id;
  9. private $ip;
  10. private $browser;
  11. private $time;
  12. private $username;
  13. private $user;
  14.  
  15. public function __construct()
  16. {
  17. global $db, $request;
  18.  
  19. // Kontrola poprawnosci ciastka
  20. if(!isset($_COOKIE[COOKIE_NAME]))
  21. {
  22. $_COOKIE[COOKIE_NAME] = '';
  23. }
  24. if(strlen($_COOKIE[COOKIE_NAME]) != 40)
  25. {
  26. $this->create();
  27. }
  28.  
  29. // Wyslanie zapytania o sesje. Od razu sprawdzamy
  30. // jej waznosc oraz zgodnosc IP i przegladarki
  31. $time = time() - COOKIE_EXPIRE;
  32.  
  33. $stmt = $db->query('SELECT session_user, session_ip,
  34. session_browser, session_time, session_username 
  35. FROM sesion
  36. WHERE session_id = "' .$_COOKIE[COOKIE_NAME]. '" AND
  37. session_ip = "' .$request -> getIp(). '" AND
  38. session_browser = "' .$request -> getBrowser(). '" AND
  39. session_time > "' .$time. '"');
  40.  
  41.  
  42. if($db->num_rows())
  43. {
  44. $session = $db->fetch_row();
  45. $this->id = $_COOKIE[COOKIE_NAME];
  46. $this->ip = $session['session_ip'];
  47. $this->browser = $session['session_browser'];
  48. $this->time = $session['session_time'];
  49. $this->username = $session['session_username'];
  50.  
  51. setcookie(COOKIE_NAME, $this->id, time() + COOKIE_EXPIRE);
  52. $stmt = $db->query('UPDATE sesion SET
  53. session_time = "' .time(). '" 
  54. WHERE session_id = "' .$_COOKIE[COOKIE_NAME]. '"');
  55.  
  56.  
  57. if($session['session_user'] == 0)
  58. {
  59. // sesja anonimowa
  60. $this->user = new user(true);
  61. }
  62. else
  63. {
  64. // sesja zalogowanego
  65. $stmt = $db->query('SELECT user_id AS `id`,
  66. user_mail AS `login`, user_pass AS `password`,
  67. user_name AS `name`, user_lastname AS `lastname`
  68. FROM users 
  69. WHERE user_id="' .$session['session_user']. '"');
  70.  
  71.  
  72.  
  73.  
  74. if($db->num_rows())
  75. {
  76. $array = $db->fetch_row();
  77. $this->user = new user(false, $array['id'], $array['login'], $array['password'], $array['name'], $array['lastname']);
  78. }
  79. else
  80. {
  81. $this->create();
  82. }
  83. }
  84. }
  85. else
  86. {
  87. $this->create();
  88. }
  89. } // end __construct();
  90.  
  91. private function create()
  92. {
  93. global $db, $request;
  94.  
  95. $this->garbageCollector();
  96. // utworz nowa anonimowa sesje. Wczesniej usun stare z bazy
  97.  
  98. $this->id = sha1(uniqid(time().$request->getIp()));
  99.  
  100. setcookie(COOKIE_NAME, $this->id, time() + COOKIE_EXPIRE);
  101.  
  102. $stmt = $db->query('INSERT INTO sesion (session_id,
  103. session_user, session_time, session_browser,
  104. session_ip, session_username) 
  105. VALUES("' .$this->id. '", 0, "' .time(). '", 
  106. "' .$request->getBrowser(). '", "' .$request->getIp(). '", "Gość")');
  107. $this->user = new user(true);
  108. } // end create();
  109.  
  110. public function update(user $user)
  111. {
  112. global $db, $request;
  113.  
  114. if($user->isAnonymous())
  115. {
  116. if($this->user->isAnonymous())
  117. {
  118. throw new Exception('Próba przerejestrowania anonimowego użytkownika!');
  119. }
  120.  
  121. }
  122. // Zmiana ID sesji oraz przypisanie do niej usera
  123. $newId = sha1(uniqid(time().$request->getIp()));
  124. setcookie(COOKIE_NAME, $newId, time() + COOKIE_EXPIRE);
  125.  
  126. $username = $user->getName() ." " .$user->getLastname();
  127. $stmt = $db->query('UPDATE sesion SET
  128. session_id = "' .$newId. '", session_user = "' .$user->getId(). '",
  129. session_username = "' .$username. '"
  130. WHERE session_id = "' .$this->id. '"');
  131.  
  132. $this->id = $newId;
  133. $this->user = $user;
  134. } // end update();
  135. private function garbageCollector()
  136. {
  137. global $db;
  138.  
  139.  
  140. $db->query('DELETE FROM support_sesion_users WHERE
  141. session_time < '.(time() - COOKIE_EXPIRE));
  142. } // end garbageCollector();
  143. public function getUser()
  144. {
  145. return $this->user;
  146. } // end getUser();
  147. }
  148. ?>


a po utworzeniu instancji klasy session i request w ten sposób sprawdzam czy zalogowany użytkownik:

  1. <?php
  2. if($session->getUser()->isAnonymous())
  3. {
  4. header('Location: login.php');
  5. die();
  6. }
  7. else
  8. {
  9. echo '<p>Witaj, '.$session->getUser()->getName().' '.$session->getUser()->getLastname().' !
  10. (<a href="login.php">Wyloguj się</a>)</p>';
  11. }
  12. ?>


przepraszam, że pisze post pod postem, ale czy ktoś może mi pomóc w rozwiązaniu tego problemu, gdyż jest to bardzo denerwujący fakt i wielka przeszkoda w produkcie
Zyx
Sprawdź w bazie długość pola odpowiedzialnego za przechowywanie informacji o przeglądarce. Już raz miałem taką sytuację, że na IE mi nie trzymało sesji, gdyż jej identyfikator nie mieścił się w bazie danych i go ucinało, co oczywiście przy późniejszym porównywaniu wywoływało niezgodność i odrzucenie sesji.
craker
Dzięki nie wpadłem nawet na coś takiego.

ale jak to się mówi na najprostsze rozwiązania najtrudniej wpaść



Mam jednak problem nadal, na localhoście jak testuje to ok działa wszędzie, ale jak wgram na serwer to nadal jest problem z przeglądarką IE, pole na Browser wydłużyłem do 255 znaków a mimo to nadal jest problem z trzymaniem sesji na tej przeglądarce proszę o pomoc
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.