2016-12-18 7 views
0

index.php:Uncaught Ошибка: Вызов функции члена fetchAll() на булевой

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

и получаю ошибку:

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

Если Я выполняю в sql() метод, execute() и fetch() данные внутри него, он может действительно получить данные, но поместите метод execute() и fetch() в метод query(), получив ошибку me ssage, Любая идея? ;

+1

'false' означает, что ваш запрос не удался, используйте http://php.net/manual/en/pdostatement.errorinfo.php, чтобы увидеть ошибку. –

+0

@u_mulder I var_dump (statement) и получил ture ./Applications/MAMP/htdocs/Test/Program/Component/Db.php:60:boolean true – Fan

+0

Используйте функцию в моем комментарии, __please__ –

ответ

2

Существует ошибка в коде. В этой строке:

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

Метод execute() является PDOStatement::execute. Это подпись:

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

Это означает, что возвращает логическое значение. Ваша ошибка в том, что вы пытаетесь позвонить fetchAll() на boolean.

Дополнительную информацию об этом сообщении см. В this page.

0

Попробуйте

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

И

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

Этот случай хорош, но i все еще не могу понять, что я сделал. – Fan

+0

лучше вернуть заявление. Делает вашу функцию WAY более гибкой и полезной –