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

t m matbluecat @ gmail.com
2009年 8月 27日 (木) 17:32:23 JST


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 メーリングリストの案内