2011-11-22 48 views
2

我有這個查詢,我想運行在我的PHP應用程序後端。從概念上講,工作表是一個跟蹤我們所有工作表的數據庫。購買是一個數據庫,用於跟蹤哪些用戶有權訪問哪個表。我想要運行的查詢是用戶的ID,我可以獲取他們應該訪問的所有工作表。在查詢窗體:建立查詢與積極的記錄的利弊

select distinct s.wsid, s.name from sheets s, purchases p where 
s.wsid = p.wsid AND p.uid = *value*; 

其中是由應用程序

我看到它的方式輸入的東西有兩種方式去獲得這個在後端工作。

項1)

public function getPurchasedSheets($uid){ 
    if(is_numeric($uid)){ //check against injections 
     $query = "select distinct s.wsid, s.name from sheets s, purchases p 
      where s.wsid = p.wsid AND p.uid = ".$uid.";" ; 
     return $this->db->query($query); 
    } else { 
     return NULL; //or false not quite sure how typing works in PHP 
    } 
} 

選項2)

public function getPurchasedSheets($uid){ 
    if(is_numeric($uid)){ 
     $this->db->select('wsid, name'); 
     $this->db->distinct(); 
     $this->db->from('purchases'); 
     //not sure which order the join works in... 
     $this->db->join('sheets', 'sheets.wsid = purchases.wsid'); 
     $this->db->where('uid ='.$uid); 
     return $this->db->get(); 
    } else { 
     return NULL; 
    } 
} 

源對所有的笨活動記錄命令:

codeigniter.com/user_guide/database/active_record.html

單向做事有某種表現或安全差異嗎? 或其他?這樣做的第二種方式似乎更讓我困惑......這有點複雜,因爲我不確定如何在這種編碼風格中進行參考消歧,因爲購買和工作表都有一個uid字段,但它們意味着不同的東西(除了首先不太熟悉SQL連接命令之外)。購買中的Uid(用戶ID)表示用戶已購買該工作表,而工作表中的Uid表示哪個用戶擁有該工作表。

TL,DR:基本上,我在問是否有一個原因,我應該沉迷於尋找如何做選項2的方式嗎?

回答

7

主要好處是:

從數據庫引擎,其中文庫可以爲您特定於數據庫的SQL語法差異護理
  • 抽象。相關的,如果你有 有/想改變你正在使用的數據庫。理論上, 第二種形式應該還是可以的。
  • 「活動記錄」語法 會自動爲您轉義參數。
  • 可讀性,雖然 這是一個味道的問題。

順便說一下,如果你在一個PHP 5的環境是,該庫還支持方法鏈:

if(is_numeric($uid)){ 
     return $this->db->select('wsid, name') 
           ->distinct() 
           ->from('purchases') 
           ->join('sheets', 'sheets.wsid = purchases.wsid') 
           ->where('uid ='.$uid) 
           ->get(); 
           // nb. didn't check your join() syntax, either :) 
    } 

可能偏離主題:CodeIgniter的Active Record的比主動的實現更多的是查詢生成器的記錄。如果你想知道。當被視爲查詢生成器時,它會更有意義;)FWIW,我喜歡CodeIgniter。我從感情中開玩笑。

1

查詢綁定是最容易實現的,並且查詢構建的功能相同 - 並且不會像構建過程那樣限制您的工作。

$query = $this->db->query('SELECT something FROM table WHERE name1=? AND name2=?', array($name1, $name2); 
$result = $query->result(); 

http://codeigniter.com/user_guide/database/queries.html