我正在尝试修改一个脚本,将我的会话数据存储在数据库中而不是默认值,但是我遇到上述错误时遇到了一些麻烦。它说我在第176和201行收到了错误。
这是sessionPdo类中的函数
public function _write($id, $sessionData)
{
$session = $this->fetchSession($id); // line 176
if( $session === false ) {
$stmt = $this->db->prepare('INSERT INTO sessions (id, data, unixtime) VALUES (:id, :data, :time)');
} else {
$stmt = $this->db->prepare('UPDATE sessions SET data = :data, unixtime = :time WHERE id = :id');
}
$stmt->execute( array(
':id' => $id,
':data' => $sessionData,
':time' => time()
));
if( $this->transaction ) {
$this->db->commit();
}
}
这是fetchSession方法,以防万一。
public function fetchSession($id)
{
$stmt = $this->db->prepare('SELECT id, data FROM sessions WHERE id = :id AND unixtime > :unixtime');
$stmt->execute( array(':id' => $id, ':unixtime' => ( time() - (int) ini_get('session.gc_maxlifetime') ) ) );
$sessions = $stmt->fetchAll();
if( $this->transaction ) {
$this->db->commit();
}
return empty($sessions) ? false : $sessions[0] ;
}
我一直在努力找到我做错的事情,因为我发现的所有解决方案都是因为程序员试图从课外调用$ this。我是PDO的新手,所以提前感谢您提供的任何帮助。
答案 0 :(得分:0)
您正在静态调用函数_write
,这意味着您可以找到代码中的某个位置:
sessionPdo::_write($id, $sessionData);
你要做的是创建sessionPdo类的对象,然后在这个对象上运行这个函数,即:
$sessObj = new sessionPdo();
$sessObj->_write($id, $sessionData);
答案 1 :(得分:0)
是的,问题在于您是静态调用_write()
。您需要了解静态方法和实例方法之间的区别。我为没有在这里解释而道歉,但是在SO上可能有5000人遇到了同样的问题,这可以通过大约15分钟的应用阅读来解决。
当您对此感到满意时,请研究Singleton和Factory模式,这两种模式是从静态上下文提供对对象实例的访问,并且通常在这种情况下应用。