2017-09-21 2 views
-1

Im nouveau à OOP. Ce sont mes fonctions. Ma déclaration préparée n'est pas travail:Erreur irrécupérable: Uncaught Erreur: Appel à la méthode non définie 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(); 
} 

L'erreur que cette fonction me donne une fois appelé est

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

classe Connect d'où je reçois mon exemple de connexion et je suis assez sûr que je ne pas avoir une faute de frappe. Les instructions préparées sont faites sur les classes PDO, non? Alors, pourquoi ma déclaration de préparation prend-elle Connect classe mais pas PDO?

EDIT: Voici ma classe 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; 
} 
} 
} 

Répondre

0

Connect::getInstance() est mis en œuvre de façon incohérente. Lorsqu'il est appelé la première fois, il crée un objet new Connect et le renvoie. D'autres fois, il renvoie l'objet PDO dans $this->_dbh.

getInstance() doit toujours renvoyer l'objet Connect et vous devez disposer d'une autre méthode pour renvoyer l'objet PDO.

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

Ensuite, la première classe devrait faire:

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

'$ this -> _ dbh' me donne toujours une valeur nulle. –

+0

Merci d'avoir conversé avec moi. J'ai corrigé mon problème J'ai ajouté 'DB :: getInstance ($ dbdetails);' ci-dessous ma classe Connect et semble fonctionner maintenant (sans le '$ this -> _ dbh = Connect :: getInstance ($ dbdetails) -> getConnection() 'partie'. –

+0

Si vous ne faites pas cela, alors '$ this -> _ dbh-> prepare()' ne peut pas fonctionner, puisque vous n'avez pas défini cette variable. – Barmar