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:
<?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)
{
if($file = fopen('session.txt', 'a')) {
}
}
// Otwarcie sesji
function session_open($path, $name)
{
$host = "localhost";
$user = "jm";
$pass = "123pas";
session_log('session_open');
{
session_log
('Funkcja session_open(): błąd połączenia z bazą danych: ' . mysql_error()); 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');
{
session_log
('Funkcja session_read(): błąd wyboru bazy danych: ' . mysql_error()); return false;
}
$sql = 'select * from ' . session_table() . ' where id = "' . $id . '"';
{
session_log
('Błąd MySQL: ' . mysql_error() . ' z SQL: ' . $sql); return false;
}
{
session_log
('Kwerenda MySQL zwróciła ' . mysql_num_rows($result) . ' wierszy.'); 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');
{
session_log
('Funkcja session_write(): błąd wyboru bazy danych: ' . mysql_error()); return false;
}
$sql = 'update ' . session_table
() . ' set data = "' . addslashes($data) .'"';
if(isset($PHP_AUTH_USER)) $sql .= ', user = "' . addslashes($PHP_AUTH_USER) . '"';
$sql .= ' where id = "' . $id .'"';
{
session_log
('Błąd funkcji session_write() ' . mysql_error() . ' z SQL: ' . $sql); 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';
{
session_log
('Błąd funkcji session_write() ' . mysql_error() . ' z SQL: ' . $sql); 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');
{
session_log
('Funkcja session_remove(): błąd wyboru bazy danych: ' . mysql_error()); return false;
}
$sql = 'delete from ' . session_table . ' where id = "' . $id . '"';
{
session_log('Wykonano polecenie MySQL delete.');
return true;
}
else
{
session_log
('Błąd aktualizacji MySQL: ' . mysql_error() . " z SQL: " . $sql); return false;
}
}
// mechanizm porządkujacy (usuwający stare sesje)
function session_gc($life)
{
session_log('session_gc');
{
session_log
('Funkcja session_gc(): błąd wyboru bazy danych: ' . mysql_error()); return false;
}
$sql = 'delete from ' . session_table
() . ' where time < "' . date("YmdHis", time() - $life) . '"';
print('session_gc sql: ' . $sql);
{
return true;
}
else
{
session_log
('Błąd funkcji session_gc(): ' . mysql_error() . ' z SQL: ' . $sql); 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)
);
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...