Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
209 views
in Technique[技术] by (71.8m points)

php - Fatal error: Call to a member function count() on a non-object in not solved

Sorry i think this question has a lot , but I still do not get the solution of this question, so solved my script please:( sorry my bad english.

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

Thats is my class validate.

and my DB class

    <?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;
        }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You didn't check the return value $check, you are assuming it's an object and it obviously is not.

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

Always check return values ... especially if you're going to immediately call methods on them ...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...