<?php /* *Собственный механизм сессий *автор: nc_soft *25.11.07 */ /* далее перечислена библиотека функций, которая эмулирует поведение сессий. поместим эту библиотеку в файл session.php */ // Открываем function open($save_path, $session_name) { // Сетевой адрес MySQL-сервера $dblocation = "localhost"; // Имя базы данных $dbname = "boo"; // Пользователь $dbuser = "root"; // Его пароль $dbpasswd = ""; // Устанавливаем соединение с базой данных $dbcnx = mysql_connect($dblocation,$dbuser,$dbpasswd); if (!$dbcnx) exit ("К сожалению, не доступен сервер MySQL : ".mysql_error()); // Выбираем базу данных if (!@mysql_select_db($dbname,$dbcnx)) exit("К сожалению, не доступна база данных : ".mysql_error()); //создаем таблицу в mysql (если она еще не создана) mysql_query("CREATE TABLE IF NOT EXISTS session ( id_session int(11) NOT NULL auto_increment, session tinytext NOT NULL, putdate datetime NOT NULL default '0000-00-00 00:00:00', value tinytext NOT NULL, PRIMARY KEY (id_session) ) TYPE=MyISAM;"); return true; } function close() { // Закрываем соединение с базой данных mysql_close(); return true; } function read($id) { // Читаем данные сессии $query = "SELECT value FROM session WHERE session = '$id'"; $ses = mysql_query($query); if(!$ses) exit(mysql_error()); $session = mysql_fetch_array($ses); // Возвращаем данные, помещённые в сессию return $session['value']; } function write($id, $sess_data) { // Проверяем не зарегистрирована ли сессия // с таким именем $query = "SELECT COUNT(*) FROM session WHERE session = '$id'"; $ses = mysql_query($query); if(!$ses) exit(mysql_error()); if(mysql_result($ses,0) > 0) { // Такая сессия уже существует, необходимо // обновить время обращения к сессии $query = "UPDATE session SET putdate = NOW(), value = '$sess_data' WHERE session = '$id'"; if(!mysql_query($query)) exit(mysql_error()); return false; } else { // Это первое обращение к сессии, необходимо // её зарегистрировать в базе данных $query = "INSERT INTO session VALUES (NULL,'$id', NOW(), '$sess_data')"; $ses = mysql_query($query); if(!$ses) exit(mysql_error()); return true; } } function destroy($id) { // Удаляем сессию с идентификатором $id $query = "DELETE FROM session WHERE session = '$id'"; if(!mysql_query($query)) exit(mysql_error()); return true; } function gc($maxlifetime) { // Выполняем "сборку мусора" - удаляем // старые записи $query = "DELETE FROM session WHERE putdate < NOW() - INTERVAL 20 MINUTE"; if(!mysql_query($query)) exit(mysql_error()); return true; } //говорим интерпритатору, что мы будем использовать свои функции для обработки сессий session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); //старт сессии session_start(); /* на этом библиотечный файл session.php закончен, теперь просто инклудим его где требуется сессия */ /* пример использования (ничем не отличается от стандартных сессий) */ /* <?php //include "session.php"; $_SESSION['name'] = "Имя"; $_SESSION['surname'] = "Фамилия"; print_r($_SESSION); echo '<a href="session.php">go</a>'; ?> */ /* Создано по материалам книги "Головоломки на PHP для хакера" */ ?>