わかりました、この質問を投稿する前に、すべてがうまくリストアップされていることを願っています.
1: ストアド プロシージャを使用せずに、mysqli とのシングルトン MySQL 接続を使用しています。
2: session_set_save_handler を説明するコードをオンラインで見つけ、それを MySqlSessionStore というクラスとして組み込みました。
3: 私の DB クラスには、次のパブリック関数があります。
public function escapeStringForDB($input)
{
return $this->_link->real_escape_string($input);
}
と$this->_link = new mysqli($host, $user, $password, $database)
4:$db = MySQL::getInstance(array(DB_SERVER, DB_USER, DB_PASS, DB_NAME));
これは、静的 DB 関数を呼び出す方法です (ここで異常なことは何もありません)。
問題: コメントを外すまですべてが機能し$id = $db->escapeStringForDB($id);
、次のエラーが発生します。
非オブジェクトでメンバー関数 real_escape_string() を呼び出す
MySqlSessionStore のコード例:
function read($id)
{
$db = MySQL::getInstance(array(DB_SERVER, DB_USER, DB_PASS, DB_NAME));
$id = $db->escapeStringForDB($id);
$db->query("SELECT data FROM sessions WHERE BINARY id = '". $id ."'");
//echo "SELECT data FROM sessions WHERE id = '". $id ."'";
$result = $db->fetch();
if(isset($result) && !empty($result))
{
return $result->data;
}
//MUST send an empty string if no session data
return "";
}
その他の質問、備考:
- 私は session_regenerate_id() を使用していますが、明らかにこれは session_set_save_handler で削除する必要があります。
- 正確にはどこに置くの
session_write_close();
ですか?私は自分の db クラスのデストラクタでそれを取得しましたが、おそらくそれは行くべき道ではありません。 - 私はこれを他のプロジェクトに害を及ぼすことなく使用していますが、ここではセッションハンドラーの動作が異なり、混乱しているようです:)
事前に感謝します。さらに情報が必要な場合は、喜んで提供します。