[PHP-users 34720] session_set_save_handlerで独自のセッション管理でエラー(Mysqli利用)

View: New views
2 Messages — Rating Filter:   Alert me  

[PHP-users 34720] session_set_save_handlerで独自のセッション管理でエラー(Mysqli利用)

by t m-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

matといいます

PHPのセッションデータをDBに格納するように独自のセッション保存関数を作ってやったのですが以下のようなWarningが出てしまいます
このエラー発生の原因と対処方法をご存知の方がいらっしゃいましたらご教授願います。

・エラー内容
Warning: mysqli_real_escape_string()
[function.mysqli-real-escape-string]: Couldn't fetch mysqli in
/hogehoge/SessionClass.php on line 1000000
※関数名についてはそのとき実行したmysqliの関数名です。mysqli_query()だったり、mysqli_num_rows()だったり
※印象としてはopen()関数では接続は成功しているが、その後他の関数でオブジェクト内の変数が利用できていない(引き継がれていない)のではないかといった感じです。

・やりたいこと
mysqli拡張モジュールの関数を利用してセッションのデータをmysqlのデータベース内で管理するクラスを作りたい

・環境
PHP 5.1.6
MySQL 5.0.22

・セッション保存関数(クラス)
mysqli拡張モジュールを利用して作成
基本となるソースはPHPマニュアルページの「session_set_save_handler」のページにあったものを引用してmysql関数をmysqli関数に変更しています。
※ソースは下部に記載します
※mysqli拡張モジュールの関数ではなくmysql関数を利用した場合には正常に動作が確認できました




=== ソースここから ===
class SessionClass
{
        /**
        * a database connection resource
        * @var resource
        */
        private static $_sess_db;

        /**
        * Open the session
        * @return bool
        */
        public static function open() {
                global $db_setting;

                $db_setting;
                if (self::$_sess_db = mysqli_connect($db_setting['host'],
$db_setting['user'], $db_setting['pass'], $db_setting['db'])) {
                        mysqli_set_charset(self::$_sess_db, $db_setting['client_charset']);
                        return true;

                }

                return false;
        }

        /**
        * Close the session
        * @return bool
        */
        public static function close() {
                return mysqli_close(self::$_sess_db);
        }

        /**
        * Read the session
        * @param int session id
        * @return string string of the sessoin
        */
        public static function read($id) {
                $id = mysqli_real_escape_string(self::$_sess_db, $id);
                $sql = sprintf("SELECT `sessions` FROM `session_data` " . "WHERE
`id` = '%s'", $id);
                if ($result = mysqli_query(self::$_sess_db, $sql)) {
                        if (mysqli_num_rows($result)) {
                                $record = mysqli_fetch_assoc($result);
                                return $record['session_data'];
                        }
                }
                return '';
        }

        /**
        * Write the session
        * @param int session id
        * @param string data of the session
        */
        public static function write($id, $data) {
                print "[".self::$_sess_db."]";
                $sql = sprintf("REPLACE INTO `session_s` VALUES('%s', '%s', '%s')",
                        mysqli_real_escape_string(self::$_sess_db, $id),
                        mysqli_real_escape_string(self::$_sess_db, $data),
                        mysqli_real_escape_string(self::$_sess_db, time())
                );
                return mysqli_query(self::$_sess_db, $sql);
        }

        /**
        * Destoroy the session
        * @param int session id
        * @return bool
        */
        public static function destroy($id) {
                $sql = sprintf("DELETE FROM `sessions` WHERE `session_id` = '%s'", $id);
                return mysqli_query(self::$_sess_db, $sql);
        }

        /**
        * Garbage Collector
        * @param int life time (sec.)
        * @return bool
        * @see session.gc_divisor      100
        * @see session.gc_maxlifetime 1440
        * @see session.gc_probability    1
        * @usage execution rate 1/100
        *        (session.gc_probability/session.gc_divisor)
        */
        public static function gc($max) {
                $sql = sprintf("DELETE FROM `sessions` WHERE `session_expires` <
'%s'", mysqli_real_escape_string(self::$_sess_db, time() - $max));
                return mysqli_query(self::$_sess_db, $sql);
        }
}

session_set_save_handler(array('SessionClass', 'open'),
                         array('SessionClass', 'close'),
                         array('SessionClass', 'read'),
                         array('SessionClass', 'write'),
                         array('SessionClass', 'destroy'),
                         array('SessionClass', 'gc')
                         );

session_start();
=== ソースここまで ===
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34721] Re: session_set_save_handlerで独自のセッション管理でエラー(Mysqli利用)

by t m-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

matです

自己解決しました^^;;

どうやらmysqliを利用する場合にはregister_shutdown_function()でsession_write_close()を登録してからsession_set_save_handler()をしなければならなかったようです。
↓参考
http://bugs.php.net/bug.php?id=33772

よくよくマニュアルに目を通すとsession_set_save_handler()のところにも同様の内容が書いてあったようです

http://jp.php.net/manual/ja/function.session-set-save-handler.php#84739
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3