[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: session_set_save_handler и ООП в php
lavrik0000
Доброе время суток, ребят помогите допиреть в чем косяк.
Решил я заюзать стандартную функцию session_set_save_handler для реализации собственного хранения сессий, решил хранить сессии в бд. Написал класс для оброботки сессий, так же у меня есть класс для работы с бд.
Проблема заключается в следующем в методе write класса сессий напрочь не видит класс бд. Обращение к методу write в классе сессий происходит из функции session_set_save_handler. Он думаем что класс бд не инициализирован. Подскажите как сделать чтобы метод класса сессий все таки его увидел класс бд. Класс бд инициализируется первым.

Вот вырезки из кода

Файлик index.php

require_once 'include/config.php';
require_once 'include/class/class.db.php';
require_once 'include/session.php';

$db = new db($db_host, $db_user, $db_pass, $db_db, ""); // db($host, $username, $password, $name,$prefix,$p_connect=false,$debug=false)

$handler = new SessionHandler();

session_set_save_handler( array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gb'));


//Инициируем сессию
session_start();



//---------------------- Тест работы сессии: ---------------------------------

echo '<h1>'.session_id().'</h1>';

// Создадим некий инкремент, если он не существовал,
// И увеличим его на 1, если он существует:

if( isset($_SESSION['increment']) )
{
$_SESSION['increment']++;
}
else
{
$_SESSION['increment'] = 1;
}

echo '<h1> increment = '.$_SESSION['increment'].'</h1>';


Файлик session.php

<?php
class
SessionHandler
{

// Эти функции оставим пустыми...
function open($sess_path, $sess_name)
{
return true;
}

function close()
{
return true;
}

// Читаем данные
function read($sess_id)
{
global $db;

$sql = "SELECT `sess_data` FROM `sessions` WHERE `session_id`='".$sess_id."';";
$query = $db->query($sql);
$num = $db->num_rows($query);

$current_time = time();

// Если данные получены, нам нужно обновить дату
// доступа к данным:

if($num > 0)
{
$row = $db->fetch_assoc($query);

$sql = "UPDATE `sessions` SET date_touched='".$current_time."' WHERE session_id='".$sess_id."';";
$db->query($sql);

// Как мы помним только из этого обработчика
// Мы возвращаем данные, а не логическое значение:

return html_entity_decode($row['sess_data']);
}
else
{
$sql = "INSERT INTO `sessions` SET session_id='".$sess_id."', date_touched='".$current_time."';";
$db->query($sql);

return '';
}
}


// Пишем данные:
function write($sess_id, $data)
{
global $db;

$current_time = time();

$sql = "UPDATE `sessions` SET `date_touched`='".$current_time."', `sess_data`='".htmlentities($data,ENT_QUOTES)."' WHERE `session_id`= '".$sess_id."';";

$db->query($sql);

return true;
}

// Уничтожаем данные:
function destroy($sess_id)
{
global $db;

$sql = "DELETE FROM `sessions` WHERE `session_id`='".$sess_id."';";

$db->query($sql);

return true;
}

// Описываем действия сборщика мусора:
function gb($sess_maxlifetime)
{
global $db;

$current_time = time();

$sql = "DELETE FROM `sessions` WHERE date_touched + '".$sess_maxlifetime."' < '".$current_time."';";

$db->query($sql);

return true;
}

}

?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.