Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]Zapisanie sesji w bazie
Forum PHP.pl > Forum > Przedszkole
OlgaG
Napisałam własną funkcję obsługi sesji - tak by dane sesji były zapisywane w bazie danych. Dane zapisują się, ale mam problem z kasowaniem danych sesji w bazie.

Całość funkcji jest zapisana w klasie DatabaseSessionStorage.

W klasie DatabaseSessionStorage jest funkcja distroy(), która odpowiada za kasowanie danych sesji z bazy:
  1. <?php
  2. //metoda destroy usuwa wszystkie rekordy dla danego identyfikatora sesji, zwraca T
    RUE lub FALSE
  3. public static function distroy($id)
  4. {
  5. //dla bezpieczeństwa filtrujemy id sesji
  6. $id = self::$s_conn->real_escape_string($id);
  7.  
  8. $query = "DELETE FROM ap_sessiondata WHERE session_id = '$id';";
  9.  
  10. //zapytanie do bazy
  11. $result = self::$s_conn->query($query);
  12.  
  13. //jeśli wystąpiły błędy
  14. if(self::$s_conn->errno !=0)
  15. {
  16. return FALSE;
  17. }
  18. else
  19. {
  20. return TRUE;
  21. }
  22.  
  23. }
  24. ?>


W pliku session_test.php mam skrypt, który ma wykorzystywać tą funkcję do kasowania danych sesji z bazy:

  1. <?php
  2. /* Włączenie pliku obsługi sesji */
  3. require_once("libs/db_session.inc.php");
  4. $session = new DatabaseSessionStorage();
  5.  
  6. /* Rozpoczęcie sesji*/
  7.  
  8. if(empty($_SESSION))
  9. {
  10. $_SESSION['user'] = 'uzytkownik';
  11. }
  12.  
  13.  
  14. if(isset($_POST['logout']))
  15. {
  16. $id = session_id();
  17. $session->distroy($id);
  18. echo "Sesję zakończono";
  19. }
  20. else
  21. {
  22. echo '
  23. <form method="POST" action="session_test.php">
  24. <input type="submit" name="logout" value="Wyloguj się" />
  25. </form>
  26. ';
  27. }
  28.  
  29.  
  30. ?>
  31. </body>
  32. </html>
  33. <?php session_write_close(); ?>


Problem polega na tym, ze dane sesji zapisują się w bazie, ale nie kasują się. Po naciśnięciu przycisku "wyloguj się" skrypt przechwytuje zmienną $_POST, zapytanie do bazy "DELETE..." jest prawidłowe(sprawdziłam print-em ), ale dane dalej są w bazie.

Zastanawiam się czy nie potrzeba jakiegoś potwierdzenia, że chcę skasować te dane z tabeli.

Czy ktoś wie, jak rozwiązać ten problem?
1010
coś musi być nie tak z tym zapytaniem skoro nie usuwa...

Sprawdź wykorzystując funkcje mysql_affected_rows" title="Zobacz w manualu PHP" target="_manual


a tak poza tym.... co zrobisz jak ktoś się nie wyloguje a tylko zamknie przeglądarkę?
OlgaG
Cytat(1010 @ 26.01.2008, 22:22:59 ) *
coś musi być nie tak z tym zapytaniem skoro nie usuwa...

Sprawdź wykorzystując funkcje mysql_affected_rows" title="Zobacz w manualu PHP" target="_manual
a tak poza tym.... co zrobisz jak ktoś się nie wyloguje a tylko zamknie przeglądarkę?


Hmm, funkcja mysql_affected_rows daje wynik 0, co jest raczej oczywiste, jeśli nie kasuje danych z tabeli.

Co do zamkniecia przegladarki to mam zdefiniowaną w klasie funkcję, która usuwa sesje z bazy po upływie określonego czasu.
1010
Wyświetl sobie przed zapytaniem wartość $id... Może występuje problem z jej przekazaniem?
OlgaG
Cytat(1010 @ 26.01.2008, 22:44:04 ) *
Wyświetl sobie przed zapytaniem wartość $id... Może występuje problem z jej przekazaniem?


Wyświetlam i pokazuje prawidłowy id sesji np. 4e1b5f61b654871ffa3fed72a83ba783, który został zapisany w bazie. Jak wyświetlam całe zapytanie do bazy dostaje: DELETE FROM ap_sessiondata WHERE session_id = '4e1b5f61b654871ffa3fed72a83ba783';

Wygląda prawidłowo....

Wklepałam nawet to zapytanie prosto do bazy danych przez phpmyadmin i wykasował.
1010
wklej zapytanie do phpmyadmina... Sprawdź tam...
OlgaG
Cytat(1010 @ 26.01.2008, 22:53:40 ) *
wklej zapytanie do phpmyadmina... Sprawdź tam...



Już to zrobiłam (mój poprzedni post:) i z poziomu phpmyadmin zapytanie jest prawidłowe i kasuje wybrany rekord. Zrobiłam jeszcze jeden eksperyment: w kodzie spróbowałam nie korzystać z metody klasy tylko bezpośrednio wpisałam zapytanie, czyli zamiast:

  1. <?php
  2. $id = session_id();
  3. $session->distroy($id);
  4. ?>


dałam coś takiego:

  1. <?php
  2. $query = "DELETE FROM ap_sessiondata WHERE session_id = '$id';";
  3. $result = $conn->query($query);
  4. ?>


i też nie kasuje. blinksmiley.gif
1010
do mysql_query daj na końcu mysql_error()... Może jednak jest coś nie tak z zapytaniem...


a może metoda query w clasie conn jest niepoprawna?
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.