За последние 24 часа нас посетили 17524 программиста и 1600 роботов. Сейчас ищут 1006 программистов ...

Не записывает в БД данные сессии

Тема в разделе "Прочие вопросы по PHP", создана пользователем Feo, 16 сен 2008.

  1. Feo

    Feo Активный пользователь

    С нами с:
    16 сен 2008
    Сообщения:
    2
    Симпатии:
    0
    Всем привет.
    Вобщем переделываю сессии для хранения в бд при помощи session_set_save_handler();
    Всё идёт нормально, кроме записи данных сессии. Код функции sess_write:
    Код (Text):
    1.   function sess_write($sess_id, $data)
    2.   {
    3.     global $db;
    4.     $time = time();
    5.     $sql = 'UPDATE om_sessions SET sess_data = "'.$data.'", sess_last_touch = '.$time.' WHERE sess_id = "'.$sess_id.'" LIMIT 1';
    6.     $db->query($sql);
    7.     return true;
    8.   }
    Ошибка заключается в чём: если не использовать register_shutdown_function('session_write_close'); то пхп ругается, что мол класса $db не существует (он создаётся при старте скрипта). С ней же ошибок никаких не выдаётся. Но и результатов тоже нет.
    Так же мне известно, что функция sess_write точно вызывается, но, как я понимаю, соединения с бд нет.
    Если же в этой функции попробовать создать новое соединение, оно не создаётся. Беда :(
    Так же в начале скрипта устанавливаю:
    Код (Text):
    1.   ini_set('session.save_handler', 'user');
    2.   ini_set('session.gc_probability', '100');
    В чём может заключаться ошибка? Может в php.ini ещё что указать надо?
    зы: PHP 5.2, Apache 2.2.x, Linux
     
  2. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    http://ru.php.net/manual/ru/function.session-set-save-handler.php

    бегло просмотрел, думаю в этом примечании указано решение твоей проблемы:
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    session_set_save_handler можно устанавливать в классе, тоесть примерно так:

    PHP:
    1. <?php
    2. class Session {
    3.     private $db;
    4.  
    5.     public function __construct($db) {
    6.         $this->db = $db;
    7.     }
    8.  
    9.     public function start() {
    10.             array($this, 'open'),
    11.             array($this, 'close'),
    12.             array($this, 'read'),
    13.             array($this, 'write'),
    14.             array($this, 'destroy'),
    15.             array($this, 'gc')
    16.         );
    17.  
    18.         session_start();
    19.     }
    20.  
    21.     // а тут описание всех хэндлеров
    22. }
    23.  
    24. $session = new Session($db);
    25. $session->start();
    26.  
    Тогда проблема отпадёт.