2017-03-23 1 views
-2

내 코드에서 "null에 대한 구성원 함수 호출 (call on a member function prepare()"을 일으킬 수있는 원인을 파악하려고합니다. , 그러나 나는 그것이 일어나고있는 이유를 이해할 수 없다. 여기에 내 현재 코드 :"null에서 멤버 함수 호출"오류가 발생하지만 데이터가 여전히 데이터베이스에 추가되었습니다.

$password_hash = password_hash($this->password, PASSWORD_DEFAULT); 

    $sql = 'INSERT INTO users (name, email, password_hash) 
      VALUES (:name, :email, :password_hash)'; 

    $db = static::getDB(); 
    $stmt = $db->prepare($sql); //This is the line specified in the error 

    $stmt->bindValue(':name', $this->name, PDO::PARAM_STR); 
    $stmt->bindValue(':email', $this->email, PDO::PARAM_STR); 
    $stmt->bindValue(':password_hash', $password_hash, PDO::PARAM_STR); 

    $stmt->execute(); 

코드가 $db를 얻을 수있는 것은 여기에 있습니다 :이 코드에

$dsn = 'mysql:host='.Config::DB_HOST.';dbname='.Config::DB_NAME.';charset=utf8'; 


     $db = new PDO($dsn, Config::DB_USER, Config::DB_PASSWORD); 

     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

      return $db; 

값은 모든 올바른 데이터와 설정 파일에서입니다. 가장 혼란스러운 것은 양식 입력이 제출 될 때이 오류가 발생한다는 것입니다. 양식 항목의 데이터가 데이터베이스에서 끝나기 때문에 연결 및 데이터가 정확하다는 것을 알 수 있지만이 오류는 계속 팝업되어 내 코드가 성공 화면으로 돌아 가지 않습니다.

업데이트 : 여기

static::getDB()의 전체 정적 함수입니다 :

abstract class Model 
{ 


    protected static function getDB() 
    { 
     static $db = null; 

     if ($db === null) { 
      $dsn = 'mysql:host=' . Config::DB_HOST . ';dbname=' . Config::DB_NAME . ';charset=utf8'; 
      $db = new PDO($dsn, Config::DB_USER, Config::DB_PASSWORD); 


      $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 

     return $db; 
    } 
} 
+0

$ db 변수가 초기화되었는지 확인 했습니까? –

+0

구체적으로 확인하지는 않았지만 데이터베이스에 양식 데이터를 추가 할 수 있으므로 가정합니다. –

+0

'$ db = static :: getDB(); 이것은 틀린 것 같습니다. 통화 상황을 볼 수 있습니까? – bassxzero

답변

1
static::getDB() 

나는 당신이 그 작동 방식을 이해 생각하지 않습니다. static은 내의 used to resolve static calls입니다. 주 코드가 클래스 안에 전혀없는 것처럼 보입니다. 따라서 클래스 이름 자체를 참조해야합니다.

Model::getDB() 
+1

'static :: getDB()'가 멤버 메소드 외부에서 호출 된 경우 다른 에러가 발생했을 것입니다. 나는 똑같은 생각을했지만, 그냥 시도했다. 이것은 그가 클래스 내에서이 줄'static :: getDB()'을 실행해야한다는 것을 의미합니다. – bassxzero

+0

@bassxzero 그렇다면 우리는 질문에 대답하기에 충분한 코드를 가지고 있지 않다. – Machavity

+0

@Machavity'추상 클래스들 '에 관한 일부 문서에서 OP를 가르키고 싶을지도 모른다. – RiggsFolly

관련 문제