致命错误:调用未解决的非对象的成员函数count() [英] Fatal error: Call to a member function count() on a non-object in not solved

查看:364
本文介绍了致命错误:调用未解决的非对象的成员函数count()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 <?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($规则){
'min':
if(strlen($ value)< $ rule_value){
$ this-> addError({$ item}必须至少为{$ rule_value}个字符。);
}
break;
case'max':
if(strlen($ value)> $ rule_value){
$ this-> addError({$ item}必须是{$ rule_value的最大值}字符。);
}
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 exists。);
}
break;



$ b if(empty($ this-> _errors)){
$ this-> _passed = true;
}
返回$ this;
}
private function addError($ error){
$ this-> _errors [] = $ error;

public function errors(){
return $ this-> _errors;
}
public function passed(){
return $ this-> _passed;




$ b $ p
$ b

这就是我的类验证。



和我的DB类

 <?php 
class DB {
private static $ _instance = null;
私人$ _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();
}
返回self :: $ _ instance;

公共函数查询($ 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 ++;

$ b if($ this-> _query-> execute()){
$ this-> _results = $ this-> _query->使用fetchall(PDO :: FETCH_OBJ);
$ this-> _count = $ this-> _query-> rowCount();
} else {
$ this-> _error = true;
}
}
返回$ this;

public function action($ action,$ table,$ where = array()){
if(count($ where)=== 3){
$ operator = 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;
}
}
}
返回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 $ values。=',';
}
$ x ++;

$ sql =INSERT INTO users(`。implode('`,`',$ keys)。`)VALUES({$ values});
if(!$ this-> query($ sql,$ fields) - > error()){
return true;
}
返回false;

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

foreach($ fields为$ name => $ value){
$ set。={$ name} =?;
if($ x $ 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;



$ div $解析方案

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

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

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


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

解决方案

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 ...

这篇关于致命错误:调用未解决的非对象的成员函数count()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆