2017-09-21 19 views
-1

Ich bin neu in OOP. Dies sind meine Funktionen. Meine vorbereitete Anweisung ist nicht Arbeits:Schwerwiegender Fehler: Uncaught Fehler: Aufruf zu undefinierter Methode prepare()

function __construct($dbdetails){ 
    $this->_dbh = Connect :: getInstance($dbdetails); 
    return $this->_dbh; 
} 


function sendData(){   
    $stmt = $this->_dbh->prepare("INSERT INTO users (username, email, password) VALUES(:username, :email, :password)"); 

    $stmt->bindValue(':username', $this->_sentdetails[0]); 
    $stmt->bindValue(':email', $this->_sentdetails[1]); 
    $stmt->bindValue(':password', $this->_sentdetails[2]); 

    $stmt->execute(); 
} 

Der Fehler, dass diese Funktion einmal gibt mir aufgerufen wird

Fatal error: Uncaught Error: Call to undefined method Connect::prepare();

Klasse Connect aus ist, wo ich meine Verbindungsinstanz bekommen, und ich bin mir ziemlich sicher, dass ich habe keinen Tippfehler. Vorbereitete Aussagen werden gemacht auf PDO Klassen, oder? Warum nimmt meine Vorbereitungsanweisung also Connect Klasse, aber nicht PDO?

EDIT: Das ist meine Klasse Connect

class Connect{ 

private $_dbh, 
     $_host, 
     $_dbname, 
     $_username, 
     $_password; 

public static $instance; 


//the actual connection 
private function __construct($dbdetails){ 

$this->_host = $dbdetails['host'];  
$this->_dbname = $dbdetails['dbname'];  
$this->_charset = $dbdetails['charset'];  
$this->_username = $dbdetails['username'];  
$this->_password = $dbdetails['password']; 

try{  
$this->_dbh = new PDO("mysql:host=$this->_host; 
          dbname=$this->_dbname; 
          charset=$this->_charset", 
          $this->_username, 
          $this->_password); 
}catch(PDOException $e){ 
    echo "Error : " . $e; 
} 
} 

//creating instance for connection 
public function getInstance($dbdetails){ 
if(!isset(self::$instance)){ 
    return self::$instance = new Connect($dbdetails); 
} 
else{ 
    return self::$instance->_dbh; 
} 
} 
} 

Antwort

0

Connect::getInstance() inkonsequent umgesetzt wird. Wenn es das erste Mal aufgerufen wird, erstellt es ein Objekt new Connect und gibt das zurück. Andere Male gibt es das Objekt PDO in $this->_dbh zurück.

getInstance() sollte immer das Connect Objekt zurückgeben, und Sie sollten eine andere Methode für die Rückgabe des PDO Objekts haben.

class Connect{ 

    private $_dbh, 
     $_host, 
     $_dbname, 
     $_username, 
     $_password; 

    public static $instance; 


    //the actual connection 
    private function __construct($dbdetails){ 

     $this->_host = $dbdetails['host'];  
     $this->_dbname = $dbdetails['dbname'];  
     $this->_charset = $dbdetails['charset'];  
     $this->_username = $dbdetails['username'];  
     $this->_password = $dbdetails['password']; 

     try{  
      $this->_dbh = new PDO("mysql:host=$this->_host; 
          dbname=$this->_dbname; 
          charset=$this->_charset", 
            $this->_username, 
            $this->_password); 
     }catch(PDOException $e){ 
      echo "Error : " . $e; 
     } 
    } 

    //creating instance for connection 
    public function getInstance($dbdetails){ 
     if(!isset(self::$instance)){ 
      self::$instance = new Connect($dbdetails); 
     } 
     return self::$instance; 
    } 

    public function getConnection() { 
     return $this->getInstance()->_dbh; 
    } 
} 

Dann sollte die erste Klasse tun:

function __construct($dbdetails) { 
    $this->_dbh = Connect::getInstance($dbdetails)->getConnection(); 
} 
+0

'$ this -> _ dbh' gibt mir noch einen Nullwert. –

+0

Vielen Dank für das Gespräch mit mir. Ich habe mein Problem behoben. Ich habe 'DB :: getInstance ($ dbdetails); 'unterhalb meiner Connect-Klasse hinzugefügt und scheint jetzt zu arbeiten (ohne das $ this -> _ dbh = Verbinden :: getInstance ($ dbdetails) -> getConnection() ; "Teil). –

+0

Wenn Sie das nicht tun, kann '$ this -> _ dbh-> prepare()' nicht funktionieren, da Sie diese Variable nicht gesetzt haben. – Barmar

Verwandte Themen