Неустранимая ошибка: использование $ this, когда не в контексте объекта - PHP, PDO, Sessions, - PullRequest
0 голосов
/ 24 октября 2011

Я пытаюсь изменить сценарий, который хранит мои данные сеанса в базе данных, а не по умолчанию, но у меня возникли некоторые проблемы, так как я продолжаю получать ошибку выше. Он говорит, что я получаю ошибку в строках 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 голосов
/ 24 октября 2011

Да, проблема в том, что вы звоните _write() статически. Вам нужно прочитать разницу между статическими и экземплярами методов. Я приношу свои извинения за то, что не объяснил это здесь, но, вероятно, только на одном SO есть 5000 человек, которые столкнулись с той же проблемой, которая решается примерно 15 минутами прикладного чтения.

Если вам это удобно, изучите шаблоны Singleton и Factory, которые представляют собой два способа предоставления доступа к экземплярам объектов из статического контекста и обычно применяются в этой ситуации.

0 голосов
/ 24 октября 2011

Вы вызываете функцию _write статически, это означает, что где-то в вашем коде вы можете найти:

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

Что вам нужно сделать, это создать объект класса sessionPdo и затем запустить эту функцию на этомобъект, то есть:

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