2011-10-24 2 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()를 정적으로 호출하는 것입니다. 정적 메소드와 인스턴스 메소드의 차이점을 읽어야합니다. 나는 여기서 설명하지 않는 것에 대해 사과한다. 그러나 같은 문제에 부딪혀있는 혼자만의 사람들이 아마도 5,000 명에 달할 것이고, 이것은 약 15 분간 적용된 독서로 해결된다.

익숙한 경우 정적 컨텍스트에서 객체 인스턴스에 대한 액세스를 제공하는 두 가지 방법 인 일반적으로이 상황에서 적용되는 싱글 톤 및 팩토리 패턴을 연구하십시오.

0

당신은 당신의 코드 어딘가에 즉, 정적 기능 _write를 호출하면 찾을 수 있습니다

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

당신이해야 할 일은, 즉 sessionPdo 클래스의 객체를 생성하고이 객체에이 기능을 실행하는 것입니다 :

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

실제로 이것은 효과가 있지만 잠재적으로 위험합니다. – alexantd

+0

또한 오류보고가 충분하다면 예를 들어 다음과 같은 경고 메시지를 보았을 것입니다. 'Strict Standards : 999 줄의 /code/abc.php에서 비 정적 메서드 sessionPdo :: _ write()를 정적으로 호출해서는 안됩니다.' – Christian

+0

스크립트의 소스에 따라 실제로 코드를 사용하지 않았습니다. $ _SESSION 변수를 실제로 사용하는 방식은 변경해서는 안되며 스크립트를 포함시켜야했습니다. 나는이 오류에 직면 해왔다. 나는 당신이 말하는 것을 찾을 수 있다면 더 자세히 조사하고 추가 할 것입니다. – SeanCAtkinson