2012-09-19 38 views
1

嘿,對不起,這個愚蠢的問題。我已經讀了很多關於在OOP的所以我決定嘗試。我有一個博客運行程序化的PHP和所有工作正常,但我有代碼的MySQL不mysqli,我決定升級到新的mysqli。這裏的問題實際上是查詢數據庫以獲得結果。我現在已經解決了這個問題兩天了。這裏是我想要實現的代碼示例。如何將mysqli類擴展爲其他類的方法

class myDB extends mysqli 
{ 
    //perform mysqli connection to host here and return $connection_handle 
} 

class siteConfig 
{ 
    private function getConfig($id) 
    { 
    $res = $connection_handle->query("SELECT * from config where id='1'"); 
    $row = $res->fetch_assoc(); 
    return $row['option']; 
    } 

} 

主索引文件,我會做到這一點

$c = new siteConfig(); 
echo $c->getConfig(1); 
//and this will return the result of the query. 

也請原諒我的編程邏輯仍然是一個非常可怕的新手在接力世界

任何想法會有所幫助謝謝。

PS

,這是工作示例代碼我使用

$db_link = mysqli_connect(DB,HOST,DB_USER,DB,PASS,DB_NAME) or die(mysql_error()); 

class myDB extends mysqli 
{ 
    public function getConfig($id, $db_link) // thanks cbuckley 
{ 
$db_link = $this->db_link; 
    $res = mysqli_query($this->db_link,"SELECT * from config where id='1'"); 
    $row = mysqli_fetch_array($res); 
    return $row['option']; 
}  
} 

我已經定義的常量和連接成功,但選擇不工作。在索引頁面上,這是[code] include('inc/dbc.php');

$db = new MyDB(); 
echo $db->getConfig(1, $db_link); 

請讓我知道我失蹤了,或者如果可能的重構代碼,我在哪裏neccessary

+0

能否請您解釋一下什麼是目的更高效的查詢擴展mysqli類(專業化?業務邏輯封裝)? – ibtarek

+0

否則,你的代碼中有一個錯誤:如果「getConfig」函數是私有的,你不能從類之外調用它「$ c-> getConfig」會觸發錯誤 – ibtarek

+0

原諒人們......就像我說的一樣一個新手來喲...你有什麼建議? @ibatarek – jcobhams

回答

2

爲什麼不延長的mysqli類,並添加功能MYDB?

class myDB extends mysqli 
{ 
    public function getConfig($id) // thanks cbuckley 
    { 
    $res = $this->query("SELECT * from config where id='1'"); 
    $row = $res->fetch_assoc(); 
    return $row['option']; 
    }  
} 

$db = new myDB; 
$db->getConfig($id); 

您可以通過使用$ this關鍵字調用內部MYDB任何mysqli的功能(這是指本身,因爲「它的自我」擴展mysqli的,它將擁有所有的mysqli具有的功能+您添加的)

+0

當我想對數據庫進行其他查詢時如何?我是否將所有這些方法作爲方法添加到mydb類中?...您是否有任何想法可以編寫通用查詢代碼,並且博客將有足夠的數據庫查詢...感謝您的答案,儘管您可以始終調用$ – jcobhams

+0

DB->查詢();在上面的例子中,因爲所有的mysqli函數仍然是你的一部分。但是您可能想要爲myDB類中的插入更新和刪除創建查詢包裝器。另外考慮使用框架,包括模型..像Yii或Zend(其中包括許多其他:); –

+0

我有yii和zend安裝在我的本地機器上,但他們不是新手友好的 – jcobhams

2

保持數據庫連接和任何業務邏輯之間的分離是很好的,所以你的例子很好。只有一些額外的東西需要整理,即應用程序邏輯如何訪問數據庫處理程序。這裏有一個例子:

class MyDB extends mysqli { 
    // any custom DB stuff here 
} 

class SiteConfig { 
    protected $db; 

    public function __construct(MyDB $db) { 
     $this->db = $db; 
    } 

    public function getConfig($id) { 
     $statement = $this->db->prepare('SELECT * FROM config WHERE id = ?'); 
     $statement->bind_param('i', $id); 

     if ($statement->execute()) { 
      $row = $statement->get_result()->fetch_assoc(); 
      return $row['option']; 
     } 
    } 
} 

$db = new MyDB('host', 'user', 'password', 'db'); 
$config = new SiteConfig($db); 
var_dump($config->getConfig(1)); 

一對夫婦的興趣點的位置:

+0

謝謝soooo多cbuckley ....如何,這是非常先進的像我這樣的noob pls分解...一個剛剛開始與mysqli和我的理解非常有限pse expanciate上自定義數據庫的東西和什麼myDB類返回....再次感謝 – jcobhams

+1

MyDB只是mysqli的一個孩子,所以你會像[正常示例](http://php.net/mysqli)一樣使用它。構建體#refsect1-mysqli.construct-例子)。在我的代碼中,MyDB沒有增加真正的價值,但它是放置數據庫連接錯誤處理等事情的最佳位置。我已經添加了連接參數以使其更清晰。然後,你所做的只是將連接傳遞給SiteConfig [構造函數](http://php.net/__construct)。我還添加了幾個興趣點:-) – cmbuckley