2011-11-01 96 views
1

當我與我的自定義功能,我得到這個錯誤執行的MySQLi查詢...庫MySQLi查詢工作不正常

Fatal error: Call to a member function execute() on a non-object in /Applications/MAMP/htdocs/RevFramework/Application/Model/Engine/eMySQLi.php on line 92 

我真的不知道什麼是錯的......也就是說,如果我設置$類型和$ params爲null,否則我相信call_user_func_array也會拋出一個錯誤。

public function query($SQL, $types = null, $params = null) 
   { 
           $this->result = $this->db->prepare($SQL); 
        
           if(isset($types) && isset($params)) 
           { 
               $bind_names[] = $types; 
                
               for ($i = 0; $i < count($params); $i++) 
               { 
                   $bind_name = 'bind' . $i; 
                   $$bind_name = $params[$i]; 
                   $bind_names[] = &$$bind_name; 
               } 
            
               call_user_func_array(array($this->result, 'bind_param'), $bind_names); 
           } 

           $this->result->execute(); 
   } 

查詢是這樣做的:

$class->query("SELECT name FROM rev_widgets ORDER BY order"); 

我完全不知道什麼可能是錯誤的。

任何幫助表示讚賞!

+2

行$ this-> result = $ this-> db-> prepare($ SQL);'沒有返回你所期望的。你可以發佈'vardump($ this-> result)'的輸出嗎?此外,您可能希望查閱[PDO :: prepare手冊](http://php.net/manual/en/pdo.prepare.php)以獲取關於它拋出的錯誤和異常的更多信息。 –

+0

'var_dump($ this-> result);'returns'bool(false)'。而且,謝謝,但我使用MySQLi,將檢查它。 –

+1

bool(false)表示您的'result'字段不包含任何對象。也許你的'db-> prepare()'方法失敗了。 – ariefbayu

回答

0

我找到了答案!那麼,我只是繼續前進,做得非常不同。

對於每個需要它的人,現在看起來都是這樣。

class Core_Model extends Core_Controller 
{ 

     private $connected; 

     private $db; 

     protected $result; 

    public function __construct() 
    { 
      //$this->connect(); 
    } 

     protected function connect() 
     { 
      if($this->connected != true) 
      { 
       $this->db = new mysqli($this->data['host'], $this->data['user'], $this->data['pass'], $this->data['database']); 

       if($this->mysqli->connect_errno)  
       { 
        $this->error($mysqli->connect_errno); 
       } 

       $this->connected = true; 
      } 
     } 

     protected function disconnect() 
     { 
      if($this->connected == true) 
      { 
       $this->db->close(); 
       $this->connected = false; 
      } 
     } 

     public function newQuery() 
     { 
      $this->connect(); 

      if(is_object($this->result)) 
      { 
       $this->result->close(); 
      } 

      return $this; 
     } 

     public function query($SQL, $params = null) 
     { 
      $this->newQuery(); 

      if(($this->result = $this->db->prepare($SQL))) 
      { 
       if($params != null) 
       { 
        call_user_func_array(array($this->result, 'bind_param'), $this->refreshParams($params)); 
       } 

       $this->result->execute(); 
      } 
      else 
      { 
       trigger_error("MySQLi query <i> '" . $SQL . "'</i> failed", E_USER_ERROR); 
      } 

      return $this; 
     } 

     public function get() 
     { 
      $parameters = $this->getFieldNames(); 
      call_user_func_array(array($this->result, 'bind_result'), $this->refreshParams($parameters)); 

      while($this->result->fetch()) 
      { 
       $x = array(); 

       foreach($this->row as $key => $val) 
       { 
        $x[$key] = $val; 
       } 

       $data[] = $x; 
      } 

      return $data; 
     } 

     public function id() 
     { 
      return $this->mysql->insert_id; 
     } 

     public function num_rows() 
     { 
      $this->result->store_result(); 

      return $this->result->num_rows; 
     } 


    private function getFieldNames() 
    { 
      $meta = $this->result->result_metadata(); 

      while($field = $meta->fetch_field()) 
      { 

       $parameters[] = &$this->row[$field->name]; 

      } 

      return $parameters; 
     } 

     private function refreshParams($params) 
     { 
      $temp = array(); 

      foreach($params as $key => $value) 
      { 
       $temp[$key] = &$params[$key]; 
      } 

      return $temp; 
     } 
} 

希望這可以幫助別人!