php
  • pdo
  • 2017-03-23 1 views -2 likes 
    -2

    私のコードで "nullへのメンバ関数の呼び出し"を引き起こしている原因を突き止めようとしています私はなぜそれが起こっているのか理解できません。ここに私の現在のコードは次のとおりです。"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; 
    

    。最も混乱しているのは、フォームエントリが送信されたときにこのエラーが発生するということです。フォームエントリのデータはデータベースで終わるので、接続とデータは正しいとわかりますが、このエラーはポップアップし続け、コードが成功画面に戻るのを防ぎます。

    アップデート:私はあなたがそれがどのように動作するかを理解するとは思わない

    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::getDB()ための完全な静的関数です。 staticは、クラスからのused to resolve static callsです。あなたのメインコードはクラス内にはまったくないようです。クラス名自体を参照する必要があります

    Model::getDB() 
    
    +1

    'static :: getDB()'がメンバメソッドの外で呼び出された場合、別のエラーが発生していました。私は同じことを考えましたが、ただ試しました。つまり、クラス内から 'static :: getDB()'という行を実行しなければなりません。 – bassxzero

    +0

    @bassxzeroもしそうなら、質問に答えるのに十分なコードがありません – Machavity

    +0

    @Machavity '抽象クラス 'に関するいくつかのドキュメントでOPを指したい場合があります – RiggsFolly

    関連する問題