2015-02-10 130 views
1

我正在製作一個網絡應用程序。在某些情況下,在服務器端我正在進行mysql查詢,我基本上說where d.id=2意思是我將外鍵硬編碼到另一個表。或者在客戶端,我有一個帶有無線電字段的表單,輸入字段值是主鍵到表中的ID號(例如1,2,3)。使用幻數是好習慣嗎?

我想知道的是使用這些'神奇數字'的好習慣,還是應該在查詢中使用字符串值(需要連接)並在表單中作爲輸入值,然後我需要使用查詢來獲取使用該字符串值的id。

似乎兩種方式,如果我需要編輯錶行(更改主鍵值或字符串值),那麼我將不得不更新客戶端和服務器端的一切。

什麼是好習慣?

由於

+0

對於你關於表單的問題,我更喜歡顯示文本並提交id字段。 – 2015-02-10 01:48:03

+0

你能舉個例子,我不明白你的意思。 – omega 2015-02-10 01:52:10

回答

2

ID號一般由數據庫(例如與MySQL AUTO_INCREMENT)任意地分配,並且它們只是定時的事故。依靠它們並將它們硬編碼到代碼中通常是一個糟糕的主意。相應的名字不太可能改變,所以如果你必須對某些東西進行硬編碼,那通常會更安全。

此外,硬編碼ID使代碼更難理解。魔術數字對讀者來說沒有固有的意義,但字符串是助記符的。

+0

這似乎是正確的答案,但我的邏輯就像是說,你在任何地方使用字符串值,然後你決定改變數據庫中記錄的字符串值,那麼你必須在任何地方更新它。例如,'紅'到'綠'。我可以想象這發生了什麼,但是看不到id會改變。你能解釋爲什麼id值更可能改變嗎? – omega 2015-02-10 01:54:53

+0

如果您需要重新創建數據庫,則字符串不會更改,但ID可能會更改。 – Barmar 2015-02-10 01:56:26

+0

但是,如果您重新創建數據庫,您可以輕鬆地添加id屬性,並強制它是相同的?就像即使它的自動增量一樣,你仍然可以添加id值,只要它的當前唯一值,它就可以工作。 – omega 2015-02-10 01:58:03

1

這是一個格式化的評論。由於歐米伽請求的例子,這裏是一個使用ColdFusion語法

<cfquery name="getChoices"> 
select choiceId, choice 
from choices 
</cfquery> 

<form> 
<cfoutput query = "getChoices"> 
<input type = "radio" name="theChoice" value = "#choiceID#">#choice# 
</cfoutput> 
<input type="submit> 
</form> 

注意,CFOUTPUT標籤遍歷查詢結果。