Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql]Zapisanie sesji w bazie
OlgaG
post
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 8.04.2007

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
1010
post
Post #2





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

Ostrzeżenie: (0%)
-----


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ę?
Go to the top of the page
+Quote Post
OlgaG
post
Post #3





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 8.04.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
1010
post
Post #4





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

Ostrzeżenie: (0%)
-----


Wyświetl sobie przed zapytaniem wartość $id... Może występuje problem z jej przekazaniem?
Go to the top of the page
+Quote Post
OlgaG
post
Post #5





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 8.04.2007

Ostrzeżenie: (0%)
-----


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ł.

Ten post edytował OlgaG 26.01.2008, 22:54:16
Go to the top of the page
+Quote Post
1010
post
Post #6





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

Ostrzeżenie: (0%)
-----


wklej zapytanie do phpmyadmina... Sprawdź tam...
Go to the top of the page
+Quote Post
OlgaG
post
Post #7





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 8.04.2007

Ostrzeżenie: (0%)
-----


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. (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
1010
post
Post #8





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

Ostrzeżenie: (0%)
-----


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?

Ten post edytował 1010 26.01.2008, 23:11:37
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:36