致命错误:在未解决的非对象上调用成员函数count()

时间:2015-10-16 03:38:06

标签: php function pdo

抱歉,我认为这个问题有很多,但我仍然没有得到这个问题的解决方案,所以请解决我的脚本:( 抱歉,我的英语不好。

  <?php
class Validate{

    private $_passed = false,
            $_error  = array(),
            $_db     = null;

    public function __construct(){
        $this->_db = DB::getInstance();
    }
    public function check($source, $items = array()){
        foreach ($items as $item => $rules) {
            foreach ($rules as $rule => $rule_value) {
                $value = trim($source[$item]);
                $item  = escape($item); 
                if($rule === 'required' && empty($value)) {
                    $this->addError("{$item} is required");
                } else if(!empty($value)) {
                    switch ($rule) {
                        case 'min':
                            if (strlen($value) < $rule_value) {
                                $this->addError("{$item} must be a minimum of {$rule_value} characters.");
                            }
                            break;
                        case 'max':
                            if (strlen($value) > $rule_value) {
                                $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                            }
                            break;
                        case 'matches':
                            if($value != $source[$rule_value]){
                                $this->addError("{$rule_value} mus match {$item}");
                            }
                            break;
                        case 'unique':
                            $check = $this->_db->get($rule_value, array($item,'=',$value));
                            if($check->count()){
                                $this->addError("{$item} alredy exist.");
                            }
                            break;
                    }
                }
            }
        }
        if(empty($this->_errors)){
            $this->_passed = true;
        }
        return $this;
    }
    private function addError($error){
        $this->_errors[] = $error;
    }
    public function errors(){
        return $this->_errors;
    }
    public function passed(){
        return $this->_passed;
    }
}

多数民众赞成是我的班级验证。

和我的DB类

    <?php
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'));
        } 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;
        }
        public 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))){
                        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++;
            }
            die($set);

            $sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";
        }
        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 个答案:

答案 0 :(得分:0)

你没有检查返回值$check,你假设它是一个对象而且显然不是。

case 'unique':
    $check = $this->_db->get($rule_value, array($item,'=',$value));
    if($check->count()){
        $this->addError("{$item} alredy exist.");
    }
    break;

始终检查返回值...特别是如果您要立即调用它们的方法......

答案 1 :(得分:0)

感谢你的回答乔,我得到了解决方案。在我编辑之前

case 'unique':
    $check = $this->_db->get($rule_value, array($item,'=',$value));
                if($check->count()){
                $this->addError("{$item} alredy exist");
                }
                break;

编辑后结束

case 'unique':
    $check = DB::getInstance();
    $check->get($rule_value, array($item,'=',$value));
        if($check->count()){
        $this->addError("{$item} alredy exist");
        }
        break;

谢谢:)