【问题标题】:Fatal error: Call to a member function count() on a non-object in not solved致命错误:在未解决的非对象上调用成员函数 count()
【发布时间】:2015-10-16 03:38:05
【问题描述】:

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

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

这是我的班级验证。

还有我的数据库类

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

【问题讨论】:

  • Count 是 php 内置关键字,用于计算数组的长度。重命名您的函数计数。

标签: php function pdo


【解决方案1】:

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

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

始终检查返回值...尤其是当您要立即对其调用方法时...

【讨论】:

    【解决方案2】:

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

    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;
    

    谢谢你:)

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2016-12-10
      • 1970-01-01
      • 2013-11-25
      • 2012-05-30
      • 2016-08-30
      相关资源
      最近更新 更多