2009-09-07 49 views
2

我用我自己的類數據庫查詢,擴展庫MySQLi:我如何在PHP中抽象mysqli準備語句?

class iDatabase extends mysqli 
{ 
    public $errorMsg; 
    private $totalQueries; 
    private $stmt; 

    public function __construct() 
    { 
     parent::__construct('localhost', 'asd', 'asd', 'asd'); 

     if (mysqli_connect_errno()) 
     { 
      $this->errorMsg = 'Could not connect to server.<br /><i>' . mysqli_connect_error() . '</i>.'; 
      return; 
     } 

     parent::query('SET NAMES utf8'); 
    } 

} 

但是執行查詢並取回結果時,我遇到麻煩了。我正在使用準備好的語句,但價值和結果的約束方式讓我感到困惑。一些研究後,我想出了這個功能,它接受查詢和參數:

public function psQuery($query, $params) 
{ 
    $this->stmt = parent::prepare($query); 
    call_user_func_array(array($this->stmt,'bind_param'), $params); 
    $this->stmt->execute(); 
} 

我的問題是,什麼是得到的結果,從這一回的最佳方式?我需要使用bind_result,然後獲取每一行,然後關閉語句。我寧願只爲每行獲得一個關聯數組 - 這可能嗎?

回答

4

因爲我們希望使它符合PDOPDOStatement接口,所以我在Zend_Db_Adapter_MysqliZend_Db_Statement_Mysqli類上做了很多工作。這很麻煩,因爲MySQLi堅持讓你綁定變量來獲得結果,以及PDOStatement支持的各種獲取模式。

如果你想看到Zend_Db代碼,要特別注意的功能 Zend_Db_Statement_Mysqli::_execute()fetch()。基本上,_execute()方法使用call_user_func_array()綁定一個變量引用數組。棘手的部分是您必須初始化數組,以便bind_result()函數獲取引用。呃,這並不完全清楚,所以請看看代碼。

或者只使用PDO的MySQL驅動程序。這就是我想要穿的鞋子。

+0

+1幫助創建我有史以來最喜歡的圖書館之一。 – karim79 2009-09-07 12:40:14

+0

我在哪裏可以找到代碼?我看了這裏,但它只是文檔,沒有代碼:http://framework.zend.com/apidoc/core/Zend_Db/Statement/Zend_Db_Statement_Mysqli.html – DisgruntledGoat 2009-09-07 13:12:30

+0

@DisgruntledGoat:當然,你可以下載它,否則你可以瀏覽在線來源http://framework.zend.com/code/browse/Standard_Library/standard/trunk/library/Zend – 2009-09-07 15:32:19

0

看來,你必須做你說什麼「我需要使用bind_result,然後取每一行,然後關閉聲明」

我覺得沒有簡單的方法。