【问题标题】:Fatal error: Using $this when not in object context - PHP, PDO, Sessions,致命错误:不在对象上下文中使用 $this - PHP、PDO、Sessions、
【发布时间】:2011-10-24 18:34:14
【问题描述】:

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

【问题讨论】:

  • 代码本身看起来不错。问题可能首先在于_write()。如果该代码在对象范围之外调用 _write(),您将收到此错误,因为在这种情况下 $this 不会在 _write() 中定义。
  • 176201分别是哪几行?
  • 与PDO无关。您不是偶然在任何地方静态地调用_write() 吗? sessionPdo::_write(.....)?尝试在第 176 行之前添加 print_r(debug_backtrace()) 以查看调用的内容。
  • @Jonathon Spooner - 第 176 行被注释在第一部分代码的第三行。我没有包含第 201 行,因为我想我一次只处理一个问题,并希望它是相同的解决方案。
  • @alexantd 我已经添加了你的建议,它返回了这个: Array ( [0] => Array ( [function] => _write [class] => we_sessionPdo [type] => : : [args] => Array ( [0] => 2b73efe7a6899da83ab0ad7ccb474560 [1] => access|i:1;currentURL|s:42:"localhost/music-phonebook/index.php";mpbat|i:594546384; ) ) ) 这只是我存储为的一些会话变量脚本的一部分。

标签: php database oop session pdo


【解决方案1】:

是的,问题是您正在静态调用_write()。您需要阅读静态方法和实例方法之间的区别。我很抱歉没有在这里解释它,但仅在 SO 上可能就有 5,000 人遇到了同样的问题,大约 15 分钟的应用阅读就解决了这个问题。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 另外,如果他有完整的错误报告,他会看到更早的警告,例如:Strict Standards: Non-static method sessionPdo::_write() should not be called statically in /code/abc.php on line 999
    • 我实际上并没有使用该代码,根据我正在修改的脚本的来源,我实际使用 $_SESSION 变量的方式不应该改变,我需要做的就是包括脚本,但是,当我遇到这些错误时。如果我能找到你在说什么,我会调查并添加更多细节。
    • 虽然我已经包含了您建议的第一部分,以创建对象的实例。在我无法链接到我的数据库的早期阶段,我遇到了一个类似的问题。我通过创建 PDO 的实例并将其作为变量传递给我的控制器并传递给我的模型来解决这个问题。我是否也需要对我的 $session PDO 执行相同的操作?
    • 我确定的是,您需要阅读一些关于 PHP 中的 OOP(以及一般的 OOP)的内容,尝试一些示例,习惯 Singelton/Factory/Dependency Injection/Observer 模式,然后再决定什么最适合您的应用程序。
    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多