0

好的,我希望在发布这个问题之前我已经很好地列出了所有内容,因为我在这里和那里找到了一些解决方案,但对我的问题没有真正的答案。

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 类的析构函数中得到了它,但也许这不是要走的路;
  • 我在其他项目上使用它并没有伤害,但这里会话处理程序的行为似乎不同并且让我感到困惑:)

在此先感谢您,如果您需要更多信息,我很乐意提供。

4

1 回答 1

0

这应该有效:

public function escapeStringForDB($input)
{ 
   $this->connect(); 
   return $this->_link->real_escape_string($input); 
}
于 2010-07-29T15:07:37.887 回答