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:
<?php // Dostarczenie nazwy bazy danych function session_db() { return('probka'); } // Dostarczenie nazwy tabeli function session_table() { return('session'); } // Zapis komunikatów z funkcji sesji function session_log($message) { { } } // Otwarcie sesji function session_open($path, $name) { $host = "localhost"; $user = "jm"; $pass = "123pas"; session_log('session_open'); { return false; } return true; } // Zamknięcie sesji function session_close() { session_log('session_close'); return true; } // Funkcja przyjmuje identyfikator sesji i zwraca łańcuch zawierający dane sesji. // Jeśli dane nie są dostępne, funkcja zwraca łańcuch o zerowej długości. function session_read($id) { session_log('session_read'); { return false; } $sql = 'select * from ' . session_table() . ' where id = "' . $id . '"'; { return false; } { session_log('Funkcja session_read() zwróciła ' . $row['data']); return $row['data']; } else { session_log('Funkcja session_read() znalazła zero rekordów przy kwerendzie SQL: ' . $sql); return ""; } } // Funkcja przyjmuje identyfikator sesji oraz jej zakodowane dane, // zapisuje dane do bazy danych. // W przypadku powodzenia zwraza true, w razie wystąpienia błędu wartość false. function session_write($id, $data) { session_log('session_write'); { return false; } $sql .= ' where id = "' . $id .'"'; { return false; } { session_log('Funkcja session_write() zaktualizowała ' . $rows . ' wierszy kwerendą SQL: ' . $sql); return true; } session_log('Funkcja session_write() zaktualizowała zero wierszy kwerendą SQL: ' . $sql); $sql = 'insert into ' . session_table . ' set data = "' . addslashes($data) . '", id = "' . addslashes($id) . '", time = null'; { return false; } else { session_log('Funkcja session_write() wstawiła wiersz kwerendą SQL: ' . $sql); return true; } } // usunięcie istniejącego rekoru sesji function session_remove($id) { session_log('session_remove'); { return false; } $sql = 'delete from ' . session_table . ' where id = "' . $id . '"'; { session_log('Wykonano polecenie MySQL delete.'); return true; } else { return false; } } // mechanizm porządkujacy (usuwający stare sesje) function session_gc($life) { session_log('session_gc'); { return false; } { return true; } else { return false; } } session_set_save_handler("session_open", "session_close", "session_read", "session_write", "session_remove", "session_gc"); ?>
Lecz gdy dołączę ten plik do innego i uruchomię sesją:
<?php ?>
dostaję błąd systemowy: Pamięć nie może być read...
Gdzie może być błąd.
Kod SQL tworzący bd:
CREATE TABLE session ( id varchar(32) NOT NULL, time timestamp(14), user tinytext NOT NULL, DATA text NOT NULL, PRIMARY KEY(id) );