2016-12-18 1 views
0

index.php:Uncaught Erreur: Appel à une fonction membre fetchAll() sur booléenne

$db = new Db(); 
$param = [':name' => 'Alex']; 
$data = $db->sql('select * from test where name = :name',$param)->query(); 
var_dump($data); 

et obtenir l'erreur:

Fatal error: Uncaught Error: Call to a member function fetchAll() on boolean 

DB.php

public function sql($sql,array $params = null) 
    { 
     $sql = $this->connection->prepare($sql); 

     if($params){ 
      foreach ($params as $key => $param) { 
       $sql->bindParam($key, $param); 
      } 
     } 

     $this->statement = $sql; 
     return $this; 
    } 


    public function query($type = 1) 
    { 
     $statement = $this->statement->execute(); 

     return ($type == 1) ? $statement->fetchAll(static::$DB_FETCH) : $statement->fetch(static::$DB_FETCH); 
    } 

Si Je cours dans la méthode sql(), execute() et fetch() les données à l'intérieur, il peut vraiment obtenir les données, mais mettre les execute() et fetch() à la méthode query(), obtenir l'erreur moi ssage, une idée? ;

+1

'false' signifie que votre requête a échoué, utilisez http://php.net/manual/fr/pdostatement.errorinfo.php pour voir l'erreur. –

+0

@u_mulder Je var_dump (déclaration) et got ture ./Applications/MAMP/htdocs/Test/Program/Component/Db.php:60:boolean true – Fan

+0

Utilisez la fonction dans mon commentaire, __please__ –

Répondre

2

Il y a une erreur dans votre code. Dans cette ligne:

$statement = $this->statement->execute(); 

La méthode execute() est PDOStatement::execute. Ce est la signature:

public bool PDOStatement::execute ([ array $input_parameters ]) 

Ce qui signifie qu'il retourne booléenne. Votre erreur est que vous essayez d'appeler fetchAll() sur un booléen.

Pour plus d'informations sur le message d'erreur, voir this page.

0

Essayez cette

public function query($sql,array $params = null,$type = 1) 
    { 
     $sql = $this->connection->prepare($sql); 

     if($params){ 
      foreach ($params as $key => $param) { 
       $sql->bindParam($key, $param); 
      } 
     } 

     $this->statement = $sql; 

     $statement = $this->statement->execute(); 

     return ($type == 1) ? $statement->fetchAll(static::$DB_FETCH) : $statement->fetch(static::$DB_FETCH); 
    } 

Et

$data = $db->query('select * from test where name = :name',$param); 
+0

Ce boîtier est bon, mais je Je n'arrive toujours pas à comprendre le mal que j'ai fait. – Fan

+0

il est préférable de renvoyer une déclaration. Rend votre fonction plus flexible et utile –