За последние 24 часа нас посетили 17629 программистов и 1282 робота. Сейчас ищут 1434 программиста ...

Сессии в MySQL, помогите пож найти косяг

Тема в разделе "Прочие вопросы по PHP", создана пользователем guai, 19 май 2007.

  1. guai

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

    С нами с:
    18 янв 2007
    Сообщения:
    14
    Симпатии:
    0
    Такая тема: мне нужны сессии тока для зарегенных клиентов. Остальным там просто хранить нечего.
    Решил кароче приаттачить сессии сразу к пользователям.
    Табличка:
    CREATE TABLE `folk` (
    `login` varchar(20) default NULL,
    `password` varchar(40) NOT NULL default '',
    `rank` enum('client','admin') NOT NULL default 'client',
    `sid` varchar(32) NOT NULL default '',
    `sdata` text NOT NULL,
    `stime` int(10) unsigned NOT NULL default '0',
    PRIMARY KEY (`sid`),
    KEY `stime` (`stime`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

    А еще, чтобы было побезопаснее хочу выдавать при каждом запросе скрипта новый sid и в базе соответственно менять старый на новый.
    Сначала делал $old_sid=session_id($new_sid); и менял в базе. Косячит. То и куки и транс_сиды вместе прут, то ни то, ни то. Забил.

    Второй вариант: открыл сессию, сохранил ее данные, закрыл, открыл новую с новым именем, туда обратно всё вернул.
    Прёт, но тока со стандартным механизмом сессии, в файлы вот который...
    А с моим, который в базу пишет, не прёт.

    Помогите пожалста разобраться почему.

    Код:
    <?php

    // <ДЛЯ БД>
    define('DB_SERVER','localhost');
    define('DB_USERNAME','root');
    define('DB_PASSWORD','');
    define('DB_DBNAME','dbname');


    function open ($save_path, $session_name)
    {
    return true;
    }

    function close()
    {
    return true;
    }

    function read ($id)
    {
    // Соединение, выбор БД
    mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die('Could not connect');
    mysql_select_db(DB_DBNAME);

    $query="SELECT `sdata` FROM `folk` WHERE `sid`='$id'";
    $result=mysql_query($query);
    $row=mysql_fetch_array($result,MYSQL_ASSOC);
    return $row!=false?$row['sdata']:'';
    }

    function write ($id, $sess_data)
    {
    // Соединение, выбор БД
    mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die('Could not connect');
    mysql_select_db(DB_DBNAME);

    $query="SELECT @login:=`login`,@password:=`password`,@rank:=`rank` FROM `folk` WHERE `sid`='$id'";
    $result=mysql_query($query);
    $query="SET @password:=IF(ISNULL(@password),'',@password), @rank:=IF(ISNULL(@rank),'',@rank)";
    $result=mysql_query($query);

    $query="REPLACE INTO `folk` VALUES (@login,@password,@rank,'$id','$sess_data',UNIX_TIMESTAMP())";
    $result=mysql_query($query);
    return $result;
    }

    function destroy ($id)
    {
    // Соединение, выбор БД
    mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die('Could not connect');
    mysql_select_db(DB_DBNAME);

    $query="UPDATE `folk` SET `stime`=0,`sdata`='' WHERE `sid`='$id'";
    $result=mysql_query($query);
    return $result;
    }

    function gc ($maxlifetime)
    {
    // Соединение, выбор БД
    mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die('Could not connect');
    mysql_select_db(DB_DBNAME) or die('Could not select database');

    $query="DELETE FROM `folk` WHERE ISNULL(`login`) AND `stime`<(UNIX_TIMESTAMP()-$maxlifetime)";
    $result=mysql_query($query);
    return $result;
    }

    // <без этой строчки всё пучково>
    session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");

    // <открываем данные сессии, которая уже есть>
    session_start();
    $_SESSION['jjj']='ggg';
    // <сохраняем данные>
    $data=serialize($_SESSION);
    // <закрываем ее>
    session_destroy();

    // <переоткрываем с новым sid>
    session_id(md5(uniqid(rand(),1)));
    session_start();
    $_SESSION=unserialize($data);

    print_r($_SESSION);

    ?>

    Всю ночь вожусь. Уже бы тыщщу раз сделал свой механизм сессий, но интересно всё-таки понять, где косячит.
    Пишет ваще чё-то экзотическое:
    Fatal error: session_start() [<a href='function.session-start'>function.session-start</a>]: Failed to initialize storage module: user (path: /tmp) in p:\home\art\www\user\sessions.php on line 76
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    guai
    замечание: форматируйте код соответствующими тегами.