2014-10-08 3 views
1

Я получаю сообщение об ошибке «Вызов функции функции члена()». Я пробовал различные методы, чтобы исправить это, но теперь я застрял.Вызов функции-члена count()

Проблема здесь:

var_dump($data, $field); 

if($user->count()) { 
    $this->_data = $data->first(); 

Вот мой код:

class user { 
    private $_db, 
    $_data; 

    public function __construct($user = null) { 
     $this->_db = DB::getInstance(); 
    } 

    public function create($fields = array()) { 
     if(!$this->_db->insert('users', $fields)) { 
      throw new exception('There was a problem creating an account.'); 
     } 
    } 

    public function find($user = null) { 
     if($user) { 
      $field = (is_numeric($user)) ? 'id' : 'username'; 
      $data = $this->_db->get('users', array($field, ' = ', $user)); 

      var_dump($data, $field); 
      if($user->count()) { 
       $this->_data = $data->first(); 
       return true;  
      } 
     } 
     return false; 
    } 

    public function login($username = null, $password = null) { 
     $user = $this->find($username); 

     if($user) { 
      if($this->data()->password === hash::make($password, $this->data()->$salt)) { 

       echo 'OK!'; 

      } 
     } 

     return false; 
    } 

    private function data() { 
     return $this->_data; 
    } 
} 

class DB { 
    private static $_instance = null; 
    private $_pdo, 
      $_query, 
      $_error = false, 
      $_results, 
      $_count = 0; 

      private function __construct() { 
       try { 
        $this->_pdo = new PDO('mysql:host='.Config::get('mysql/host').';dbname='.Config::get('mysql/db').'', ''.Config::get('mysql/username').'', ''.Config::get('mysql/password').''); 
      echo 'Connected'; 

       } catch(PDOException $e) { 
         die($e->getMessage()); 
       } 

      } 
      public static function getInstance() { 
       if(!isset(self::$_instance)) { 
         self::$_instance = new DB();  
       } 
       return self::$_instance; 
      } 
      public function query($sql, $params = array()) { 
        $this->_error = false; 
        if($this->_query = $this->_pdo->prepare($sql)) { 
         $x = 1; 
         if(count($params)) { 
          foreach($params as $param) { 
           $this->_query->bindValue($x, $param); 
           $x++; 
          } 
         } 
          if($this->_query->execute()) { 
           $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
           $this->_count = $this->_query->rowCount(); 
          } else { 
           $this->_error = true; 
          } 
        } 
        return $this; 
      } 

      private function action($action, $table, $where = array()) { 
        if(count($where) === 3) { 
         $operators = array('=', '>', '<', '>=', '<='); 

         $field  = $where[0]; 
         $operator = $where[1]; 
         $value  = $where[2]; 

         if(in_array($operator, $operators)) { 
          $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; 

          if(!$this->query($sql, array($value))->error()) { 
           return $this; 
          } 
         } 
        } 
        return false; 
      } 

      public function get($table, $where) { 
       return $this->action('SELECT *', $table, $where); 
      } 

      public function delete($table, $where) { 
       return $this->action('DELETE', $table, $where); 
      } 

      public function insert($table, $fields = array()) { 

         $keys = array_keys($fields); 
         $values = ''; 
         $x = 1; 

         foreach($fields as $field) { 
           $values .= '?'; 
           if($x < count($fields)) { 
            $values .= ', ';  
           } 
          $x++; 
         } 


         $sql = "INSERT INTO users (`". implode('`, `', $keys) . "`) VALUES ({$values})"; 

         if(!$this->query($sql, $fields)->error()) { 
           return true; 
         } 

       return false; 
      } 

      public function update($table, $id, $fields) { 
       $set = ''; 
       $x = 1; 

       foreach($fields as $name => $value) { 
        $set .= "{$name} = ?"; 
        if($x < count($fields)) { 
         $set .= ', '; 
        } 
        $x++; 
       } 


       $sql = "UPDATE {$table} SET {$set} WHERE id ={$id}"; 

       if(!$this->query($sql, $fields)->error()) { 
        return true;  
       } 
       return false; 
      } 

      public function results() { 
       return $this->_results; 
      } 

      public function first() { 
       return $this->_results[0]; 
      } 

      public function error() { 
       return $this->_error; 
      } 

      public function count() { 
       return $this->_count; 
      } 
} 

Пожалуйста, помогите!

ответ

-2

Если этот код:

 $field = (is_numeric($user)) ? 'id' : 'username'; 

указывает на то, что $user иногда может быть нечто иное, чем предмет, почему вы безоговорочно делать

 if($user->count()) { 

, которая требовала бы, что $user всегда является объектом?

+1

$ Пользователь - это параметр (плохой) с именем method, а не тот же объект ($ this), на который вызывается find. Кроме того, это не ответ. Извините –

+0

Извините, вставил неправильный вызов метода. OP имеет '$ user-> count()' сразу же. –

0

EDIT: Вы используете неправильный оператор в вызове $ это -> _ db-> прибудет. Вы проходите в '=', но допустимый оператор равен '=' (без пробелов). Это в сочетании с приведенными ниже рекомендациями поможет решить вашу проблему.

выглядит как вам нужно $data->count() не $user->count()

public function find($user = null) { 
    if($user) { 
     $field = (is_numeric($user)) ? 'id' : 'username'; 
     $data = $this->_db->get('users', array($field, '=', $user)); 

     if($data && $data->count() > 0) { 
      $this->_data = $data->first(); 
      return true;  
     } 
    } 
    return false; 
} 

Вы должны работать на более имена переменных, вы используете $ пользователя в нескольких местах, где фактическое значение не является объектом пользователя.

public function find($user = null) {

Это число или строка, вместо того, чтобы попытаться

public function find($queryParam = null) {

$user = $this->find($username);

Это логическое, вместо того, чтобы попытаться

$userFound = $this->find($username)'

+0

Благодарим вас за быстрый ответ, но ($ data-> count()) тоже не работало. $ Data возвращает false в моем дампе переменной. Все еще запутано. Я также попробую эти другие предложения. – RubiRed

+0

@RubiRed Я обновил свой ответ, если $ success является ложным, ваш запрос не выполняется правильно, и в этом случае вам нужно будет отлаживать его дальше. –

+0

@RubiRed Я снова посмотрел на это и обнаружил, что вы используете неправильный оператор в своем запросе получения, см. EDIT в моем ответе выше. –

0

Ваш метод query обновляет свойство $_count с подсчетом последнего выполненного запроса. У вас есть общедоступный метод доступа к этому свойству; count(). Объект класса базы данных хранится в свойстве _db. Поэтому мы можем сделать следующее:

+0

В этом случае это плохой ответ, потому что это вернет счет последнего запроса на запуск. Этот запрос никогда не запускается, потому что используется неправильный оператор. [См. Мой ответ] (http://stackoverflow.com/a/26266500/2464634) –

Смежные вопросы