2014-10-19 66 views
-1

所以我得到這個致命錯誤:「致命錯誤:調用/Applications/XAMPP/xamppfiles/htdocs/website/index.php中的非對象的成員函數count()第6行「。爲了以防萬一,我會只給你一大部分代碼。調用非對象的成員函數count()。從一個.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; 
} 

public function count() { 
    return $this->_count; 
} 

} 

這裏是我的index.php

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

$user = DB::getInstance()->get('users', array('username', '=', 'alex')); 

if(!$user->count()) { 
    echo 'No user'; 
} else { 
    echo 'OK!'; 
} 

我在做什麼錯?

+0

'$ user'不是一個對象,通過'var_dump($ user);'檢查它是什麼。因爲它不是一個對象,所以不能通過' - > count()'調用它的方法 – Cheery 2014-10-19 22:51:12

回答

0

您的get()方法的錯誤,這將導致一個SQL語句:

SELECT* * FROM .... 

您可以從get方法去除*或從action方法將其刪除,並添加一個空格get方法。

您可能需要爲您的delete方法選擇後者的工作:

public function get($table, $where) { 
    return $this->action('SELECT *', $table, $where); 
} 

和:

... 
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; 
... 

除此之外,你假設PDO會拋出異常,但你需要告訴首先是PDO。

您可以添加選項,在你的構造:當出現錯誤時

$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
$this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), 
         Config::get('mysql/username'), 
         Config::get('mysql/password'), 
         $options); 

現在PDO將拋出一個異常。

0

error message告訴你$user是非對象。看着你action()功能的代碼,我的猜測是,你$user設置爲false,是因爲一條SQL語法錯誤:

public function get($table, $where) { 
    return $this->action('SELECT*', $table, $where); // there is an extra asterisk here 

} 

而且

$sql = "{$action} * FROM {$table} WHERE {$field} {$operator} ?"; 

請注意,在額外的星號的SELECT條款。

相關問題