собственный механизм сессий

<?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 для хакера"
*/
?>