2013-12-23 81 views
3

今天我試圖將我的函數轉換爲PHP類。 我嘗試了一些基本步驟。PHP和Mysqli OOP - 處理數據庫

<?php 
    class DataBase { 
     private $host; 
     private $user; 
     private $password; 
     private $db; 
     private $mysqli; 

     function __construct() { 
      $this->host = "localhost"; 
      $this->user = "root"; 
      $this->password = ""; 
      $this->db = "my_database"; 

      $this->mysqli = new mysqli($this->host, $this->user, $this->password, $this->db); 
     } 

     function __destruct() { 
      $this->mysqli->close(); 
     } 

     public function query($query, $params = '', $bind_result) { 
      $stmt = $this->mysqli->prepare($query); 

        //Need to change this to process the array of params 
      $stmt->bind_param('i', $params); 
      $stmt->execute(); 
        //Change this to handle array of bind 
      $stmt->bind_result($bind_result); 
        //Loop the result and store it in a temp array 
      $stmt->fetch(); 
        //Don't print the statement. Just close the statement and return the array. 
      printf("%s\n", $bind_result); 
      /* close statement */ 
      $stmt->close(); 
     } 
    } 
?> 

我現在要創建另一個類。我在數據庫中創建了一個虛擬表。

<?php 
    class Dummy { 

     private $database; 

     function __construct() { 
      $this->database = new Database(); 
     } 

     public function getAllDummy() { 
      $query = "SELECT name FROM dummy WHERE id = ?"; 
      $this->database->query($query, 1, 'name'); 
     } 

    } 
?> 

但我不認爲這是做事情的正確方法。我覺得其中一些是正確的,其中一些是錯誤的。

當我調用query()函數時,是否需要在每個類的構造方法中始終連接數據庫?或者我是否需要將數據庫類更改爲靜態函數?所以我可以調用像Database :: query()這樣的函數。

看來我需要從一開始就創造一切。互聯網中是否已有這種模式? like cakephp,codeigniter

+1

你可以在其他類中使用像「__construct(Database $ db)」這樣的稱爲「依賴注入」的東西;要使用多個參數進行查詢,請查看[this comment](http://www.php.net/manual/en/mysqli-stmt.bind-param.php#104073)。這裏的一些人會推薦使用PDO來擁有更「光滑」的界面。 – Passerby

回答

2

我想推薦你閱讀一些關於ORM for PHP的東西。例如我使用Doctrine 2(http://www.doctrine-project.org/)這有點複雜,但絕對值得學習。你已經完成了所有你已經完成的代碼,那麼爲什麼你應該重新編寫代碼呢?

在你的OOP principe中有一些錯誤。

  • 您正在爲像Dummy這樣的每個類創建數據庫實例,如果您將擁有類Users,Articles,您將創建3x數據庫,但它不是非常好。你應該把數據庫變成服務或者單例,並且只做一次。良好的解決方案可以是依賴注入(http://en.wikipedia.org/wiki/Dependency_injection)。
  • 另外我會建議你推廣整個Dummy類,使其更通用。不要使方法「getAllDummy」,但例如「getAll($ tableName)」,所以你可以使用它的每個表。
0

除了這做的一切什麼主義,而是單獨的文件,是非常容易使用原則(這是強大和全能的已經,但仍復雜),我可以建議你db.php中(http://dbphp.net)。缺點:目前還沒有很好的文檔記錄,現在還沒有大的社區。