2015-03-25 168 views
2

我试图从phpacademy关注OOP PHP tutorial,我被卡住了。我已经无数次地检查了代码,我似乎无法弄清楚。其他人也问过类似的问题,但我还没有找到适合我的解决方案。致命错误:调用非对象的成员函数错误()

,我发现了错误:

Fatal error: Call to a member function error() on a non-object in /var/www/vhosts/nightra.net/httpdocs/index.php on line 5

我是比较新的面向对象,所以我敢肯定这件事情很明显。请问你们任何一位专家都能指出我的方向吗?

这里是我的代码:

的index.php

<?php 
require_once 'core/init.php'; 

$user = DB::getInstance()->get('users', array('username', '=', 'alex')); 
if($user->error()){ 
    echo 'No user'; 
}else{ 
    echo 'OK'; 
} 

的init.php

<?php 
session_start(); 

$GLOBALS['config'] = array(
     'mysql'=>array(
      'host' => '127.0.0.1', 
      'username' => 'myusernamehere', 
      'password' => 'mypasswordhere', 
      'db' => 'mydatabasename' 
     ), 
     'remember'=>array(
      'cookie_name' =>'hash', 
      'cookie_expiry' => 604800 
     ), 
     'session'=>array(
      'session_name' => 'user' 
     ) 
); 

spl_autoload_register(function($class) { 
    require_once 'classes/' . $class . '.php'; 
}); 

require_once 'functions/sanitize.php'; 

db.php中

<?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))->error()){ 
        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 error(){ 
     return $this->_error; 
    } 
} 

的config.php

<?php 
class Config { 
    public static function get($path = null){ 
     if($path){ 
      $config = $GLOBALS['config']; 
      $path = explode('/', $path); 

      foreach($path as $bit){ 
       if(isset($config[$bit])){ 
        $config = $config[$bit]; 
       } 
      } 

      return $config; 
     } 

     return false; 
    } 
} 

回答

2

望着index.php代码和DB.php

$user有其价值从BD::get方法从DB::action方法,它可以返回false返回值来,所以你需要测试$user是否为false

此时您还应该手动测试数据库上的查询。如果有的话,也尝试获得PDO错误。

+0

它返回假的休息元素相似,你是正确的整个代码阵列$正确 。我修改它以使用计数函数,现在它正在工作。谢谢! – 2015-03-25 17:35:47

0

上面的回答是看好其中单引号内访问实际上它应该是$field = $where[0]; 的数组,其中

+0

请考虑将此添加为上述答案的评论。 – Sunil 2018-02-17 07:09:49

相关问题