2012-02-28 189 views
2

所以這就是我想要的。 我想使用PDO,因爲它是我喜歡的,所以我想在PDO之上添加一些新的方法。PHP - 擴展PHP數據對象以添加新功能

像:更新(),插入(),刪除(),fetchAllAssoc(),等...

所以我會從一個類內部都PDO和PDO Statement對象的工作。 由於無法實現更新,我將不得不建立一個查詢,準備()它,這將返回PDO Statement對象,然後我將不得不bindValues,然後執行。

這是我迄今所做的:

<?php 

    namespace Database\DBAL; 
    use PDO; 

    class Database extends PDO 
    {    
     protected static $instance; 

     public static function getInstance() 
     { 
      if(empty(static::$instance)) 
      { 
       // This will be fetched from config 
       $dns = "mysql:host=localhost;dbname=db_name";    
       $username = "root"; 
       $password = "my_pwd"; 
       static::$instance = new Database($dns, $username, $password); 

      } 
      return static::$instance; 
     } 

     /** 
     * Detect param type 
     */ 

     protected function detectType($value) 
     { 
      if(is_string($value)) 
      { 
       return PDO::PARAM_STR; 
      } 
      else if(is_int($value)) 
      { 
       return PDO::PARAM_INT; 
      }        
      else if(is_null($value)) 
      { 
       return PDO::PARAM_NULL; 
      } 
      else if(is_bool($value)) 
      { 
       return PDO::PARAM_BOOL; 
      } 
      else 
      { 
       return false;  
      } 
     }   

     /** 
     * Updates table 
     */ 

     public function update($table, $data, $identifier) 
     { 

      $set = array(); 

      foreach ($data as $columnName => $columnValue) { 
       $set[] = $columnName . ' = ?'; 
      } 

      $query = 'UPDATE ' . $table . ' SET ' . implode(', ', $set) . ' WHERE ' . implode(' = ? AND ', array_keys($identifier)) . ' = ?'; 
      $params = array_merge(array_values($data), array_values($identifier)); 

      array_unshift($params, null); 
      unset($params[0]); 

      echo $query; 

      $pdos = static::$instance->prepare($query); 

      foreach($params as $key => $param) 
      { 
       $pdos->bindValue($key, $param, $this->detectType($param)); 
      } 

      return $pdos->execute(); 

     } 

    } 

?> 

你會使用這樣的:

use Database\DBAL\Database; 
$db = Database::getInstance(); 
$db->update("users", array("user_password" => "new password"), array("user_id" => 1)); 

我的問題是,這是做正確的方式? 我正在閱讀有關裝飾和門面模式,它看起來像這樣。 什麼是用我的方法擴展PDO類的最佳方法,它可以簡單地刪除,插入和獲取一些數據?我希望PDO完好無損,所以我可以按照慣常的方式使用它...我應該使用什麼樣的模式,以及最好的方法是什麼?

謝謝!

+1

你認爲使用orm like doctrine嗎? – 2012-02-28 10:34:40

+0

好吧,不是真的,我用Doctrine DBAL,而且我喜歡它,但是我認爲就DBAL API而言,它可以變得更好。我不需要ORM,但是我需要更多的方法,這樣我可以更容易地獲取數據,並且我需要從SQL注入保護的所有內容,而Doctrine DBAL則不是這樣。所以我想創建類似於Doctrine DBAL的東西,但更簡單一些,使用一些附加功能來爭用PDO,我需要的是找到應該使用哪些模式,以及什麼是擴展PDO的最佳方式。 – Limeni 2012-02-28 10:40:16

回答

0

如果我是正確的,你正在實施一個反模式的活動記錄模式。請看一些ORM框架。 我創建了我自己的:DataContext類,它包含所有PDO stuffess(我不擴展PDO!),處理所有CRUD操作的TableEntity類以及「表格中的行」的實體類。

$dc = new TestDataContext(...); 
$dc->users()->Where(column, 1, '=')->... 
$dc->users()->InsertOnSubmit(new User()) 
$dc->SubmitChanges(); 

與Linq to SQL一樣。 :-)