2011-03-27 111 views
0

我想有一個自定義函數insert/edit/delete來自database的記錄,而不是 必須寫每個頁面的單個查詢。數據輸入抽象層?

我也曾想過這樣進行:

//page.php: 

$datainput = new DataInputAbstraction(); 
$datainput->setTableName = 'portal'; 
$datainput->setAllowedFields = array('name'=>'defaultvalue','text'=>'','desc'=>''); 

$datainput->run(); 

// DataInputAbstraction.class.php: 

class DataInputAbstraction{ 
//> attr  
public function run(){ 
    if (isset($_POST['action']) && $_POST['action']=='insert') { 
     $filteredData = array_intersect_key($this->allowedFields,$_POST); 
     //> Do a mysql query to insert $filteredData to $this->table 
    } 
    //> Do other stuff if $_POST['action'] == 'edit' | 'del' 
}  
} 

基本方法run()的基礎上$ _ POST [ '行動']執行正確的行動。

過濾器表現爲做一個intersect_key與屬性allowedFileds,之後,它建立的查詢

不必要的變量

INSERT INTO $this->tableName (array_keys($field)) VALUES (array_values($field))(僞)

你認爲這是前進的好辦法?有更好的方法或PHP提供了一個類似的內置功能?

感謝

+1

真的值得重新發明輪子嗎?嘗試[RedBean](http://redbeanphp.com/#/Tutorial),一個非常棒的ORM圖層。 – 2011-03-27 19:00:30

+0

嗯,我真的很喜歡它,並在我的項目中使用它。它從未如此簡單:)但如果你有很多時間在你的手上 - 爲什麼不創造一些東西......或許更好.. – 2011-03-27 19:14:51

+0

@Briedis DAL!= ORM – 2011-03-28 14:59:16

回答

1

在我看來,如果你不想用的東西,是已經在那裏(紅豆是一個非常不錯的選擇BTW),那麼你將是很好的進行這一點。

我總是喜歡儘可能多的抽象,因爲它使您無法做出關於要使用什麼服務的艱難決定。例如,如果稍後更改數據庫提供程序,您將創建一個數據抽象層來處理所有數據事務,唯一需要重新編碼的是數據抽象類。

所以,我認爲這是個好主意。我唯一的建議是確保你堅持DRY原則,並保持抽象層非常模塊化。使用抽象層的代碼不應該知道它是如何工作的,只是它提供了所需的數據。

希望有所幫助。

0

它永遠不會工作,因爲您必須爲插入和更新設置不同的字段集。

然而,這個想法本身是不夠好,並在

$datainput = new DataInputAbstraction(); 
$datainput->setTableName = 'portal'; 

if ($action=='insert'){ 
    $datainput->setAllowedFields = array('name','text','desc','timestamp'); 
} elseif ($action=='update'){ 
    $datainput->setAllowedFields = array('name','text','desc'); 
    $datainput->setWhereConditions = array('id' => $_POST['id']); 
} 
$datainput->run($action); 

形式會好起來的。

但是,我自己更喜歡普通的SQL對一些抽象

+0

感謝您的幫助,我忽略了一些類似於where clausle的detalis,但那裏是。對於插入更新之間的區別,我可以在使用方法查詢之前輕鬆地編輯它們 – dynamic 2011-03-28 15:13:11