致命错误:调用未解决的非对象的成员函数count() [英] Fatal error: Call to a member function count() on a non-object in not solved
本文介绍了致命错误:调用未解决的非对象的成员函数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屋!
查看全文