2011-04-13 20 views
0

我現在有這個方法:數據庫字段的依賴

public function getUser($id) { 
    $user = $this->db->getSingleRecord("SELECT user_id, user_login, user_email FROM users WHERE user_id = ?", $id); 

    return $user; 
} 

我覺得這是很明顯這是什麼一樣。 $ user是一個關聯數組,因此$ user ['user_id'],$ user ['user_login']和$ user ['user_email']將存在。這將被傳遞給Smarty的模板,並在該文件中,這些鍵的使用方式:

login: {$user['user_login']|escape} <br /> 

這讓我想...這是罰款?如果數據庫字段發生變化,我現在需要編輯2個文件。我可以在方法改變這樣的事情:

public function getUser($id) { 
    $user = $this->db->getSingleRecord("SELECT user_id, user_login, user_email FROM users WHERE user_id = ?", $id); 

    if (empty($user)) 
     // return empty array 
     return $user; 
    else 
     return array('user_id' => $user['user_id'], 'user_login' => $user['user_login'], 'user_email' => $user['user_email']); 
} 

如果數據庫領域的變化,我只需要編輯一個文件(此方法)現在。我首先想到的是這種方法好得多。

另一方面,你真的應該照顧這些東西嗎?通常情況下,您不會更改這些字段。

這是最好的方法是什麼?

感謝

回答

1

考慮數據庫字段由模板巧合所需的通信和$user結構。使用您當前使用的那個。如果數據庫模式發生變化,請切換到另一個模式(您將不得不修改方法,以更改查詢)。

+0

謝謝你的答案,但我真的不明白。爲什麼我應該認爲這是巧合,爲什麼當數據庫模式更改(而不是現在)時應該切換到第二種方法?謝謝 – Bv202 2011-04-13 15:22:47

+1

目前,這兩個功能完全相同。所以使用更簡單的一個。數據庫模式更改時,您有兩種選擇:(1)僅更改查詢。這將破壞函數與其環境的契約(例如,使用模板,因爲模板需要返回數組中的某些條目)。 (2)保持合同。爲此,您必須將新查詢的結果映射到合同要求的數組條目(就像您在替代方法中那樣)。 – Oswald 2011-04-13 16:27:27

+0

謝謝,我現在明白了:) – Bv202 2011-04-13 17:12:21