好的,我希望在发布这个问题之前我已经很好地列出了所有内容,因为我在这里和那里找到了一些解决方案,但对我的问题没有真正的答案。
1:我使用的是与mysqli的单例MySQL连接,而不是使用存储过程;
2:我在网上找到了解释session_set_save_handler的代码,并将其嵌入为一个名为MySqlSessionStore的类;
3:在我的数据库类中有这个公共函数:
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));
这就是我调用静态数据库函数的方式(这里没什么特别的)
问题:一切正常,直到我取消注释$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 类的析构函数中得到了它,但也许这不是要走的路; - 我在其他项目上使用它并没有伤害,但这里会话处理程序的行为似乎不同并且让我感到困惑:)
在此先感谢您,如果您需要更多信息,我很乐意提供。