Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Использование своих функций для обработки сессий
 
 автор: sms-send   (05.09.2007 в 18:39)   письмо автору
 
 

Собственно всё работает, но вторичный вызов session_start() плюёт такую ошибку:
Fatal error: session_start() [<a href='http://www.php.su/functions/?function.session-start'>function.session-start</a>]: Failed to initialize storage module: user (path: ./) in T:\home\virtual\yandex.ru\test.php on line 57


Вот сам код:
<?php

define
('DB_HOST''localhost');
define('DB_USER''root');
define('DB_PASS''');
define('DB_NAME''sms');

if (
mysql_connect(DB_HOSTDB_USER,DB_PASS) === false)die(mysql_error());
if (
mysql_select_db(DB_NAME) === false)die(mysql_error());
mysql_query('CREATE TABLE IF NOT EXISTS `sms_sessions` (
  `sid` varbinary(20) NOT NULL,
  `upd_time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `data` blob NOT NULL,
  PRIMARY KEY  (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;'
);
function 
random_str($len$symbols 'abcdefghigklmnopqrstuvwxyzABCDEFGHI GKLMNOPQRSTUVWXYZ0123456789'){
    
$str '';
    
$symbols str_shuffle($symbols);
    
$symbols_count strlen($symbols);
    for(
$i 0$i $len$i++)$str .= $symbols[rand(0$symbols_count 1)];
    return 
$str;
}
function 
sess_open($save_path$session_name){
    return 
true;
}
function 
sess_close(){
    return 
true;
}
function 
sess_read($id){
    
$id mysql_escape_string($id);
    
$q mysql_query('SELECT `data` FROM `sms_sessions` WHERE `sid`="' $id '"');
    if(
false === $data mysql_fetch_assoc($q))return '';
    return 
$data['data'];
}
function 
sess_write($id,$data){
    
$id mysql_escape_string($id);
    
$data mysql_escape_string($data);
    
mysql_query('REPLACE INTO `sms_sessions`(`sid`,`data`) VALUES("' $id '","' $data '")');
    return 
true;
}
function 
sess_destroy($id){
    
$id mysql_escape_string($id);
    
mysql_query('DELETE FROM `sms_sessions` WHERE `sid`="' $id '"');
    return 
true;
}
function 
sess_gc($maxlifetime){
    
mysql_query('DELETE FROM `sms_sessions` WHERE UNIX_TIMESTAMP()-UNIX_TIMESTAMP(`upd_time`)>' intval($maxlifetime));
    return 
true;
}
session_set_save_handler('sess_open''sess_close''sess_read''sess_write''sess_destroy''sess_gc');
session_id(random_str(7));
session_start();

if(!isset(
$_SESSION['reg'])){
    
session_destroy();
    
session_id(random_str(7));
    
session_start();
    
$_SESSION['reg'] = true;
}

?>

   
 
 автор: deman-b   (05.09.2007 в 19:18)   письмо автору
 
   для: sms-send   (05.09.2007 в 18:39)
 

ВАУ!!! ..... это инновациионное решение в мире колесного транспорта...ВЕЛОСИПЕД))))

   
 
 автор: tricket   (05.09.2007 в 21:04)   письмо автору
 
   для: deman-b   (05.09.2007 в 19:18)
 

хм код не плохой, чувствуется, что не новичок писал...только не могу понять зачем... попытка защиты какая-то может быть?

session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');
session_id(random_str(7));
session_start();

if(!isset($_SESSION['reg'])){
    session_destroy();
    session_id(random_str(7));
    session_start();
    $_SESSION['reg'] = true;


хм...сесион старт может два раза отказывается пахать?)
не у мну бошка кругом от кода идёт....

   
 
 автор: bronenos   (05.09.2007 в 21:56)   письмо автору
 
   для: tricket   (05.09.2007 в 21:04)
 

Насколько я помню, многократные вызовы ничего не дают

   
 
 автор: sms-send   (05.09.2007 в 22:33)   письмо автору
 
   для: bronenos   (05.09.2007 в 21:56)
 

>Насколько я помню, многократные вызовы ничего не дают

<?php
session_set_save_handler
('sess_open''sess_close''sess_read''sess_write''sess_destroy''sess_gc'); 
session_id(random_str(7));  // в оригинале здесь передаётся значение SID, принятое от пользователя
session_start(); // запускаем сессию

if(!isset($_SESSION['reg'])){ // если SID передан "от балды" пользователем, а не сгенерирован скриптом
    
session_destroy(); // уничтожаем сессию
    
session_id(random_str(7)); // генерим новый SID
    
session_start(); // запускаем сессию, а она не запускается
    
$_SESSION['reg'] = true// ставим метку, что это "правильная" сессия

?>

   
 
 автор: sms-send   (05.09.2007 в 22:19)   письмо автору
 
   для: tricket   (05.09.2007 в 21:04)
 

>только не могу понять зачем... попытка защиты какая-то может быть?

Ну в общем то да, у хостера (не буду его упоминать) директория tmp, в которой хранятся "файловые" сессии, доступна на чтение всем пользователям и спереть все сессии можно обычным print_r(glob(/tmp/*));

>хм...сесион старт может два раза отказывается пахать?)

При стандартном обработчике сессий всё нормально.

   
 
 автор: tricket   (06.09.2007 в 13:52)   письмо автору
 
   для: sms-send   (05.09.2007 в 22:19)
 

товарищь гугл мне прошептал, что при возникновение ошибки как у тебя нужно:
1)php.ini отредактировать:
Это
[Session]
; Handler used to store/retrieve data.
session.save_handler = user
изменить на
[Session]
; Handler used to store/retrieve data.
session.save_handler = files
2)если нет доступа к php.ini то создай .htaccess с содержимым
RewriteEngine On
php_value session.save_handler files
3)или в начале скрпта напиши строчку
session_module_name("files");
только гугл прошептал это строго по секрету)

Особо с апачем не ковырялся, попробуй порыть в сторону .htaccess для измения директории хранения своих файлов сессий.
Чесно говоря я бы на твоём хостинге дефейснул остальные сайты, и свалил на другой хостинг :)

   
 
 автор: bronenos   (06.09.2007 в 15:30)   письмо автору
 
   для: tricket   (06.09.2007 в 13:52)
 

2)если нет доступа к php.ini то создай .htaccess с содержимым
RewriteEngine On
php_value session.save_handler files

так это ж настройка mod rewrite вроде

   
 
 автор: tricket   (06.09.2007 в 15:47)   письмо автору
 
   для: bronenos   (06.09.2007 в 15:30)
 

хм наверное строку RewriteEngine On случайно скопировал... сорри!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования