致命错误:在不在对象上下文中时使用$ this - PHP,PDO,Sessions,

时间:2011-10-24 18:34:15

标签: php database oop session pdo

我正在尝试修改一个脚本,将我的会话数据存储在数据库中而不是默认值,但是我遇到上述错误时遇到了一些麻烦。它说我在第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的新手,所以提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

您正在静态调用函数_write,这意味着您可以找到代码中的某个位置:

sessionPdo::_write($id, $sessionData);

你要做的是创建sessionPdo类的对象,然后在这个对象上运行这个函数,即:

$sessObj = new sessionPdo();
$sessObj->_write($id, $sessionData);

答案 1 :(得分:0)

是的,问题在于您是静态调用_write()。您需要了解静态方法和实例方法之间的区别。我为没有在这里解释而道歉,但是在SO上可能有5000人遇到了同样的问题,这可以通过大约15分钟的应用阅读来解决。

当您对此感到满意时,请研究Singleton和Factory模式,这两种模式是从静态上下文提供对对象实例的访问,并且通常在这种情况下应用。