2011-10-24 4 views
0

デフォルトではなくデータベースにセッションデータを保存するスクリプトを変更しようとしていますが、少し問題があります私は上記のエラーが発生し続ける。それは私がここでsessionPdoクラス致命的なエラー:PHP、PDO、セッション、

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方法でライン176と

201上のエラーを取得していますと言います。

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] ; 
} 

私はプログラマは、クラスの外から$これを呼び出そうとしましたので、私が見つけたすべてのソリューションがそうであるように、私が間違ってやっているものを見つけるのに苦労しました。私はPDOの初心者ですので、事前にお手伝いいただきありがとうございます。

+0

コード自体は問題なく表示されます。問題は、おそらく最初に '_write()'と呼ばれています。そのコードがオブジェクトのスコープの外部にある_write()を呼び出すと、この場合、$ thisは_write()内で定義されないため、このエラーが発生します。 –

+0

どの行が '176'と' 201'ですか? –

+0

PDOとは関係ありません。あなたは '_write()'を静的にどこでも呼び出すことができますか? 'sessionPdo :: _ write(.....)'? 176行の直前に 'print_r(debug_backtrace())'を追加して、何が何を呼び出すのか見てみてください。 – alexantd

答えて

0

ええ、問題は、_write()を静的に呼び出すことです。静的メソッドとインスタンスメソッドの違いを読んでおく必要があります。私はここでそれを説明しないことをお詫びしますが、同じ問題に遭遇したSOだけで約5,000人の人がいるでしょう。これは約15分間の応用読書で解決されます。

これに慣れたら、静的コンテキストからオブジェクトインスタンスへのアクセスを提供する2つの方法であるシングルトンとファクトリのパターンを調べ、この状況で一般的に適用されます。

0

あなたはあなたのコードのどこかで意味し、静的機能_writeを呼び出しているあなたは見つけることができます:

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

何がしなければならないことは、すなわちsessionPdoクラスのオブジェクトを作成し、このオブジェクトに対してこの機能を実行することです:

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

これは実際にはうまくいくかもしれませんが、潜在的に危険です。 – alexantd

+0

また、完全なエラー報告があった場合、以前の警告が表示されていました。例えば、次のような警告が表示されます: 'Strict Standards:非静的メソッドsessionPdo :: _ write()は/code/abc.php 999行で静的に呼び出されるべきではありません。 – Christian

+0

実際に$ _SESSION変数を使用する方法は変更しないでください。スクリプトのソースによれば、私は実際にそのコードを使用していません。変更する必要はありません。私はこれらのエラーに直面してきました。あなたが話していることを見つけることができたら、私は調査して詳細を追加します。 – SeanCAtkinson

関連する問題