php сессий в базе данных только запись части информации в таблицу - PullRequest
0 голосов
/ 18 мая 2010

ОБНОВЛЕНИЕ (добавлен код для класса, который выполняет чтение / запись)

<?php
error_reporting(E_ALL);

class dbSession
{
    function dbSession($gc_maxlifetime = "", $gc_probability = "", $gc_divisor = "")
    {
        if ($gc_maxlifetime != "" && is_integer($gc_maxlifetime)) {
            @ini_set('session.gc_maxlifetime', $gc_maxlifetime);
        }
        if ($gc_probability != "" && is_integer($gc_probability)) {
            @ini_set('session.gc_probability', $gc_probability);
        }
        if ($gc_divisor != "" && is_integer($gc_divisor)) {
            @ini_set('session.gc_divisor', $gc_divisor);
        }
        $this->sessionLifetime = ini_get("session.gc_maxlifetime");
        session_write_close(); 

        session_set_save_handler(
            array(&$this, 'open'),
            array(&$this, 'close'),
            array(&$this, 'read'),
            array(&$this, 'write'),
            array(&$this, 'destroy'),
            array(&$this, 'gc')
        );
        register_shutdown_function('session_write_close');
        @session_start();
    }

    function open($save_path, $session_name)
    {
        $mySQLHost = "localhost";
        $mySQLUsername = "username";
        $mySQLPassword = "password";
        $mySQLDatabase = "rst_sessions";

        $link = mysql_connect($mySQLHost, $mySQLUsername, $mySQLPassword);

        if (!$link) {

            die ("Could not connect to database!");

        }

        $dbc = mysql_select_db($mySQLDatabase, $link);

        if (!$dbc) {

            die ("Could not select database!");

        }

        return true;

    }

    function close()
    {
        mysql_close();
        return true;
    }

    function read($session_id)
    {

        $result = @mysql_query("
            SELECT
                session_data
            FROM
                session_data
            WHERE
                session_id = '".$session_id."' AND
                http_user_agent = '".$_SERVER["HTTP_USER_AGENT"]."' AND
                session_expire > '".time()."'
        ");

        if (is_resource($result) && @mysql_num_rows($result) > 0) {

            // return found data
            $fields = @mysql_fetch_assoc($result);
            // don't bother with the unserialization - PHP handles this automatically
            return $fields["session_data"];

        }
        return "";
    }

    function write($session_id, $session_data)
    {

        // first checks if there is a session with this id
        $result = @mysql_query(" SELECT *FROM session_data WHERE session_id = '".$session_id."'");
        if (@mysql_num_rows($result) > 0) 
        {
            $result = @mysql_query(" UPDATE session_data
                SET
                    session_data = '".$session_data."',
                    session_expire = '".(time() + $this->sessionLifetime)."',
                    account_id = '" . $_SESSION['account']['account_id'] . "',
                    username = '" . $_SESSION['users']['username'] . "', 
                    report_logo_path = '". $_SESSION['path_to_report_logo'] . '/' . $_SESSION['report_logo_img'] . "',
                    report_footer_all = '". $_SESSION['report_footer_all'] . "',
                    report_footer_summary= '". $_SESSION['report_footer_summary'] . "'
                WHERE
                    session_id = '".$session_id."'
            ");

            // if anything happened
            if (@mysql_affected_rows()) 
            {
                return true;
            }


        } 
        else // if this session id is not in the database
        {
            $sql = "
                INSERT INTO
                    session_data
                        (
                            session_id,
                            http_user_agent,
                            session_data,
                            session_expire,
                            account_id,
                            username
                        )
                    VALUES
                        (
                            '".serialize($session_id)."',
                            '".$_SERVER["HTTP_USER_AGENT"]."',
                            '".$session_data."',
                            '".(time() + $this->sessionLifetime)."',
                            '".$_SESSION['account']['account_id']."',
                            '".$_SESSION['users']['username']."'    
                        )
            ";

            $result = @mysql_query($sql);

            if (@mysql_affected_rows()) 
            {
                // return an empty string
                return "";
            }

        }

        // if something went wrong, return false
        return false;

    }

}
?>

ОБНОВЛЕНИЕ: я раскомментировал строку в файле php.ini, чтобы разрешить запись сеанса в файл, а не в БД, и я поставил session_start () в правильных местах. Так что я смог исключить код в других местах. Эта проблема возникает только при использовании базы данных для хранения сеансов, что является обязательным требованием, поэтому, если есть какие-либо другие идеи, которые могут помочь мне решить эту проблему, дайте мне знать. Благодарю.


ОРИГИНАЛЬНЫЙ ПОЧТА: Мне трудно понять, что здесь происходит, в надежде, что кто-нибудь мне поможет.

Я использую php, MySQL хранит информацию о моем сеансе в базе данных. Приложение работает только на localhost, Vista. В файле php.ini я закомментировал строку «session.save_handler = files» и использую класс php для обработки записи / чтения сеанса и т. Д.

Мой процесс входа в систему такой: отправить учетные данные для входа через login.php. login.php вызывает loginprocess.php. loginprocess.php проверяет пользователя, и если valid запускает новый сеанс и добавляет данные в переменные сеанса, то он перенаправляет в index.php.

Вот проблема. на странице loginprocess.php есть несколько сессий, которые устанавливаются как $ _SESSION ['account_id'] = $ account_id; и т.д., но когда я иду в index.php и делаю var_dump($_SESSION), он просто говорит "array () empty" Однако, если я сделаю var_dump($_SESSION) в loginprocess.php, непосредственно перед строкой перенаправления header("Location: ../index.php");, тогда он покажет все данные в переменной сеанса. Если я загляну в базу данных, где хранится информация о сеансе, то есть данные в поле session_id, поле creation_ts и поле expires, но в поле session_data ничего нет внутри, и в прошлом это поле, где все мои данные сеанса был сохранен.

Как я могу иметь возможность var_dump сеанса в loginprocess.php, но данные не существуют в таблице БД, использует ли она какое-то кэширование? Я очистил свои куки и т. Д., Но без изменений.

Почему session_id записывается в таблицу, а фактические данные сеанса - нет?

Любые идеи приветствуются. Спасибо.

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Чтобы получить доступ к данным сеанса на PHP, вам необходимо сессионное начало раньше.

0 голосов
/ 18 мая 2010

Посмотрите на функцию serialize () и подумайте о ее использовании перед записью в базу данных; и соответствующий unserialize () при чтении

...