Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Implementacja sesji
Forum PHP.pl > Forum > PHP
JaRoPHP
WITAM!

Napisałem (a raczej odtworzyłem z "php. Czarna księga") implementację sesji opartą na bazie danych.

Kod obsługi sesji wygląda następująco:

  1. <?php
  2.  
  3. // Dostarczenie nazwy bazy danych
  4. function session_db()
  5. {
  6. return('probka');
  7. }
  8.  
  9. // Dostarczenie nazwy tabeli
  10. function session_table()
  11. {
  12. return('session');
  13. }
  14.  
  15. // Zapis komunikatów z funkcji sesji
  16. function session_log($message)
  17. {
  18. if($file = fopen('session.txt', 'a'))
  19. {
  20. $m = explode(' ', microtime());
  21. fwrite($file, date("H:i:s", $m[1]) . substr($m[0], 1) . " " . $message . "\n");
  22. fclose($file);
  23. }
  24. }
  25.  
  26. // Otwarcie sesji
  27. function session_open($path, $name)
  28. {
  29. $host = "localhost";
  30. $user = "jm";
  31. $pass = "123pas";
  32.  
  33. session_log('session_open');
  34.  
  35. if(!mysql_connect($host, $user, $pass))
  36. {
  37. session_log('Funkcja session_open(): błąd połączenia z bazą danych: ' . mysql_error());
  38. return false;
  39. }
  40.  
  41. return true;
  42. }
  43.  
  44. // Zamknięcie sesji
  45. function session_close()
  46. {
  47. session_log('session_close');
  48. return true;
  49. }
  50.  
  51. // Funkcja przyjmuje identyfikator sesji i zwraca łańcuch zawierający dane sesji.
  52. // Jeśli dane nie są dostępne, funkcja zwraca łańcuch o zerowej długości.
  53. function session_read($id)
  54. {
  55. session_log('session_read');
  56.  
  57. if(!mysql_select_db(session_db()))
  58. {
  59. session_log('Funkcja session_read(): błąd wyboru bazy danych: ' . mysql_error());
  60. return false;
  61. }
  62.  
  63. $sql = 'select * from ' . session_table() . ' where id = "' . $id . '"';
  64.  
  65. if(!$result = mysql_query($sql))
  66. {
  67. session_log('Błąd MySQL: ' . mysql_error() . ' z SQL: ' . $sql);
  68. return false;
  69. }
  70.  
  71. if(mysql_num_rows($result))
  72. {
  73. session_log('Kwerenda MySQL zwróciła ' . mysql_num_rows($result) . ' wierszy.');
  74. $row = mysql_fetch_assoc($result);
  75. session_log('Funkcja session_read() zwróciła ' . $row['data']);
  76. return $row['data'];
  77. }
  78. else
  79. {
  80. session_log('Funkcja session_read() znalazła zero rekordów przy kwerendzie SQL: ' . $sql);
  81. return "";
  82. } 
  83. }
  84.  
  85. // Funkcja przyjmuje identyfikator sesji oraz jej zakodowane dane,
  86. // zapisuje dane do bazy danych.
  87. // W przypadku powodzenia zwraza true, w razie wystąpienia błędu wartość false.
  88. function session_write($id, $data)
  89. {
  90. session_log('session_write');
  91.  
  92. if(!mysql_select_db(session_db()))
  93. {
  94. session_log('Funkcja session_write(): błąd wyboru bazy danych: ' . mysql_error());
  95. return false;
  96. }
  97.  
  98. $sql = 'update ' . session_table() . ' set data = "' . addslashes($data) .'"';
  99.  
  100. if(isset($PHP_AUTH_USER))
  101. $sql .= ', user = "' . addslashes($PHP_AUTH_USER) . '"';
  102.  
  103. $sql .= ' where id = "' . $id .'"';
  104.  
  105. if(!$result = mysql_query())
  106. {
  107. session_log('Błąd funkcji session_write() ' . mysql_error() . ' z SQL: ' . $sql);
  108. return false;
  109. }
  110.  
  111. if($rows = mysql_affected_rows())
  112. {
  113. session_log('Funkcja session_write() zaktualizowała ' . $rows . ' wierszy kwerendą SQL: ' . $sql);
  114. return true;
  115. }
  116.  
  117. session_log('Funkcja session_write() zaktualizowała zero wierszy kwerendą SQL: ' . $sql);
  118.  
  119. $sql = 'insert into ' . session_table . ' set data = "' . addslashes($data) . '", id = "' . addslashes($id) . '", time = null';
  120.  
  121. if(!$result = mysql_query($sql))
  122. {
  123. session_log('Błąd funkcji session_write() ' . mysql_error() . ' z SQL: ' . $sql);
  124. return false;
  125. }
  126. else
  127. {
  128. session_log('Funkcja session_write() wstawiła wiersz kwerendą SQL: ' . $sql);
  129. return true;
  130. }
  131. }
  132.  
  133. // usunięcie istniejącego rekoru sesji
  134. function session_remove($id)
  135. {
  136. session_log('session_remove');
  137.  
  138. if(!mysql_select_db(session_db()))
  139. {
  140. session_log('Funkcja session_remove(): błąd wyboru bazy danych: ' . mysql_error());
  141. return false;
  142. }
  143.  
  144. $sql = 'delete from ' . session_table . ' where id = "' . $id . '"';
  145.  
  146. if($result = mysql_query($sql))
  147. {
  148. session_log('Wykonano polecenie MySQL delete.');
  149. return true;
  150. }
  151. else
  152. {
  153. session_log('Błąd aktualizacji MySQL: ' . mysql_error() . " z SQL: " . $sql);
  154. return false;
  155. }
  156. }
  157.  
  158. // mechanizm porządkujacy (usuwający stare sesje)
  159. function session_gc($life)
  160. {
  161. session_log('session_gc');
  162.  
  163. if(!mysql_select_db(session_db()))
  164. {
  165. session_log('Funkcja session_gc(): błąd wyboru bazy danych: ' . mysql_error());
  166. return false;
  167. }
  168.  
  169. $sql = 'delete from ' . session_table() . ' where time < "' . date("YmdHis", time() - $life) . '"';
  170.  
  171. print('session_gc sql: ' . $sql);
  172.  
  173. if($result = mysql_query($sql))
  174. {
  175. session_log('Funkcja session_gc() usunęła ' . mysql_affected_rows() . ' wierszy.');
  176. return true;
  177. }
  178. else
  179. {
  180. session_log('Błąd funkcji session_gc(): ' . mysql_error() . ' z SQL: ' . $sql);
  181. return false;
  182. }
  183. }
  184.  
  185. session_set_save_handler("session_open", "session_close", "session_read", "session_write", "session_remove", "session_gc");
  186.  
  187. ?>


Lecz gdy dołączę ten plik do innego i uruchomię sesją:
  1. <?php
  2. ?>

dostaję błąd systemowy: Pamięć nie może być read...

Gdzie może być błąd.

Kod SQL tworzący bd:

  1. CREATE TABLE session
  2. (
  3. id varchar(32) NOT NULL,
  4. time timestamp(14),
  5. user tinytext NOT NULL,
  6. DATA text NOT NULL,
  7. PRIMARY KEY(id)
  8. );
pirat
W lini 106 mysql_query() oczekuje parametru - autor postu już wie o tym. Nie w tym jednak tkwi przyczyna...

--edit--
Linia 119 zamiast session_table() jest session_table - problem chyba rozwiązany...

następnym razem polecam włączyć w apache:

error_reporting = E_ALL & E_NOTICE
--------

ps. kuzyn czytaj PW

Pozdrawiam
JaRoPHP
HEJ!!!

Zapewniam, że Apache ma włączone raportowanie błędów
(co do raportowania: nie w Apachu owa klauzula, tylko w pliku php.ini, po drugie nie:
Cytat
error_reporting = E_ALL & E_NOTICE

ponieważ E_ALL ma w sobie wszytskie błedy (poza E_STRICT), więc wystarczy
Kod
error_reporting = E_ALL

ewentualnie
Kod
error_reporting = E_ALL & E_STRICT


Poniżej jest poprawiony kod, bez zbytniego zaciemniania (bez wpisów do pliku dziennika).
Ale problem leży chyba po stronie kochanego Windowsa (lub Apacha), a nie po stronie php - komunikat błędu (błąd aplikacji Apache: Pamięć spod "0x..." odwołuje się do pamięci pod adresem "0x...". Pamięć nie może być "read").
Po dojściu do funkcji session_write, php nie sprawdza jej i pozostałej reszty, tylko system daje powyższy błąd! Stąd pojawiły się szewskie błedy w tamtych funkcjach - pomimo raportowania wszystkich błędów!.
Chyba czas na małą reinstalacje sad.gif.

  1. <?php
  2.  
  3. // Dostarczenie nazwy bazy danych
  4. function session_db()
  5. {
  6. return('probka');
  7. }
  8.  
  9. // Dostarczenie nazwy tabeli
  10. function session_table()
  11. {
  12. return('session');
  13. }
  14.  
  15. // Zapis komunikatów z funkcji sesji
  16. function session_log($message)
  17. {
  18. if($file = fopen('session.txt', 'a'))
  19. {
  20. $m = explode(' ', microtime());
  21. fwrite($file, date("H:i:s", $m[1]) . substr($m[0], 1) . " " . $message . "\n");
  22. fclose($file);
  23. }
  24. }
  25.  
  26. // Otwarcie sesji
  27. function session_open($path, $name)
  28. {
  29. $host = "localhost";
  30. $user = "somebody";
  31. $pass = "pass";
  32.  
  33. session_log('session_open');
  34.  
  35. if(!mysql_connect($host, $user, $pass))
  36.  return false;
  37.  
  38. return true;
  39. }
  40.  
  41. // Zamknięcie sesji
  42. function session_close()
  43. {
  44. session_log('session_close');
  45. return true;
  46. }
  47.  
  48. // Funkcja przyjmuje identyfikator sesji i zwraca łańcuch zawierający dane sesji.
  49. // Jeśli dane nie są dostępne, funkcja zwraca łańcuch o zerowej długości.
  50. function session_read($id)
  51. {
  52. session_log('session_read');
  53.  
  54. if(!mysql_select_db(session_db()))
  55. return false;
  56.  
  57. $sql = 'select * from ' . session_table() . ' where id = "' . $id . '"';
  58.  
  59. if(!$result = mysql_query($sql))
  60. return false;
  61.  
  62. if(mysql_num_rows($result))
  63. {
  64. $row = mysql_fetch_assoc($result);
  65. return $row['data'];
  66. }
  67. else
  68. return "";
  69. }
  70.  
  71. // Funkcja przyjmuje identyfikator sesji oraz jej zakodowane dane,
  72. // zapisuje dane do bazy danych.
  73. // W przypadku powodzenia zwraca true, w razie wystąpienia błędu wartość false.
  74. function session_write($id, $data)
  75. {
  76. session_log('session_write');
  77.  
  78. if(!mysql_select_db(session_db()))
  79. return false;
  80.  
  81. $sql = 'update ' . session_table() . ' set data = "' . addslashes($data) .'"';
  82.  
  83. if(isset($PHP_AUTH_USER))
  84. $sql .= ', user = "' . addslashes($PHP_AUTH_USER) . '"';
  85.  
  86. $sql .= ' where id = "' . $id .'"';
  87.  
  88. if(!$result = mysql_query($sql))
  89. return false;
  90.  
  91. if($rows = mysql_affected_rows($sql))
  92. return true;
  93.  
  94. $sql = 'insert into ' . session_table() . ' set data = "' . addslashes($data) . '", id = "' . addslashes($id) . '", time = null';
  95.  
  96. if(!$result = mysql_query($sql))
  97. return false;
  98. else
  99. return true;
  100. }
  101.  
  102. // usunięcie istniejącego rekoru sesji
  103. function session_remove($id)
  104. {
  105. session_log('session_remove');
  106.  
  107. if(!mysql_select_db(session_db()))
  108. return false;
  109.  
  110. $sql = 'delete from ' . session_table() . ' where id = "' . $id . '"';
  111.  
  112. if($result = mysql_query($sql))
  113. return true;
  114. else
  115.  return false;
  116. }
  117.  
  118. // mechanizm porządkujacy (usuwający stare sesje)
  119. function session_gc($life)
  120. {
  121. session_log('session_gc');
  122.  
  123. if(!mysql_select_db(session_db()))
  124. return false;
  125.  
  126. $sql = 'delete from ' . session_table() . ' where time < "' . date("YmdHis", time() - $life) . '"';
  127.  
  128. print('session_gc sql: ' . $sql);
  129.  
  130. if($result = mysql_query($sql))
  131. return true;
  132. else
  133. return false;
  134. }
  135.  
  136. session_set_save_handler("session_open", "session_close", "session_read", "session_write", "session_remove", "session_gc");
  137.  
  138. ?>


Dodatkowo: Cieszę się, że ten kod podobno momus działa.

Qzyn czasem czyta PW, ale czsem nie ma włączonego neta smile.gif.
Ludvik
Jaro pomyliłeś operatory... Jeżeli już coś, to
Kod
error_reporting = E_ALL | E_STRICT

Zauważ, że koniunkcja tych stałych zawsze da w wyniku 0...
JaRoPHP
Oczywiście musi być alternatywa (or, czy też "|").
Z mojej strony sorki i dzięki Ludvik, że kontrolujesz.
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.