2011-11-29 149 views
3

我正在製作一個帶單選按鈕的表單(請參閱http://jsfiddle.net/mjmitche/3c6Mc/),用戶通常通過單選按鈕提交數據。什麼「類型」的單選按鈕的值必須/是否應該在mysql表中?單選按鈕的mysql數據類型是什麼?

領域的倡導,起草,採訪等都將在網絡表格上「通過」或「失敗」,所以我該怎麼做數據庫?

CREATE TABLE `shoutbox`( 
    `id` int(5) NOT NULL auto_increment, 
    `date` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `instructor` varchar(25) NOT NULL , 
    `secretmessage` varchar(255) NOT NULL default '', 
    `advocacy`  NOT NULL, 
    `drafting`  NOT NULL, 
    `interview` 
    `letter` 
    `solicitor` 
    `barrister` 
    PRIMARY KEY (`id`) 
); 

布爾

如果我使用一個布爾,做我設定值傳遞和失敗,以1和0?

<tr> 

     <td><label>Interview</label></td> 
     <td><input type="radio" name="interview" value="1" /> Pass</td> 
     <td><input type="radio" name="interview" value="0" /> Fail</td> 
    </tr> 

用這個mysql嗎?

CREATE TABLE `shoutbox`( 
    `interview` BOOLEAN NOT NULL, 

TINYINT

如果我使用一個TINYINT,我還設置通的價值和失敗爲1和0?

   <tr> 

       <td><label>Interview</label></td> 
       <td><input type="radio" name="interview" value="1" /> Pass</td> 
       <td><input type="radio" name="interview" value="0" /> Fail</td> 
      </tr> 


    CREATE TABLE `shoutbox`( 
    `interview` TINYINT NOT NULL, 

ENUM

如果我用枚舉,做我該值設置爲「合格」和「不合格」,然後在枚舉數據庫使用相同的名稱?

<td><label>Interview</label></td> 
    <td><input type="radio" name="interview" value="pass" /> Pass</td> 
<td><input type="radio" name="interview" value="fail" /> Fail</td> 
</tr> 

Mysql的

  CREATE TABLE `shoutbox`( 
      `interview` enum('pass', 'fail') NOT NULL, 
+0

單選按鈕通常適合枚舉類型最好的。 – Kevin

+1

tinyint或Enum如果你想要的東西多於0和1但「通過」和「失敗」 – malletjo

+0

我已經更新了OP,如果我使用布爾值,是否將表單字段中的「值」設置爲1和0,那麼必須記住這些數字在數據庫中代表什麼? – Leahcim

回答

3

如果插入整數值,ENUM的行爲可能會出乎意料。

例子:

CREATE TABLE `shoutbox`( 
`interview` enum('pass', 'fail') NOT NULL); 

INSERT INTO shoutbox (0); // this would be equivalent to an empty ENUM value ('') 
INSERT INTO shoutbox (1); // represents 'pass', 2 represents 'fail' 
INSERT INTO shoutbox ('pass'); // works as expected, same for 'fail'. 

如果使用ENUM,這將是最好的,這樣沒有空的或無效的字符串傳遞給驗證無線輸入值。

$interview = in_array($_POST['interview'], array('pass', 'fail')) ? $_POST['interview'] : 'fail'; 

我推薦使用BOOLEAN或TINYINT並使用intval()驗證無線電輸入值;

CREATE TABLE `shoutbox`( 
`interview` tinyint(1) NOT NULL); 

PHP:

$interview = intval($_POST['interview']); // sets interview to 0 or 1 
// "insert into shoutbox($interview);" 
+0

如果你使用「intval」來實現,那麼在實際的表單中應該設置什麼值或名稱?它應該使用「1」和「0」還是可以intval轉化爲數字?你說intval會將採訪設置爲0或1,但在採訪變爲0或1之前,面試設置爲什麼? – Leahcim

+0

收音機的名稱應該是'採訪',值應該是「0」或「1」。 Intval將字符串轉換爲整數以防止sql注入。 –

+0

謝謝,但是如果面試值是「O」和「1」,是不是已經是一個整數?那爲什麼intval需要轉換?或者值「O」和「1」實際上是看起來像整數的字符串嗎? – Leahcim

1

你應該在什麼樣的單選按鈕代表在現實世界角度來考慮這一點。

答案可能是他們代表了一個互相排斥的事物的短名單。通常,這些在具有枚舉的業務對象中表示,它們可以在數據庫中作爲tinyint節省空間。

A [tinyint] [1]可以表示-128到127之間的值,因此可用於多達256個不同的值(假設您的語言可以將枚舉值映射到負數)或多達128個不同的值(如果您的枚舉是限於非負數。如果你有更多不同的值(這將會導致一個難以使用的用戶界面),你可以採取一些措施。

對於只有兩個值的東西,你仍然不會比使用tinyint更有效率(缺少將多個問題映射到數字字段的不同位位置,除非是最極端的情況)。 MySQL確實支持支持位字段的數據類型[2],但我懷疑位(1)仍然不會使用比tinyint更少的存儲空間(它應該使用相同的數量,但我找不到特定的引用) 。

編輯:

關於你的編輯詢問如何使用MySQL枚舉數據類型,其實我不推薦它的使用,如果你有一個商業邏輯層。原因是你需要在兩個地方維護枚舉定義(業務對象和MySQL的DDL)。所以,我會以你的Tinyint爲例。我還會讓業務層爲您的用戶界面生成值,而不是硬編碼它們。

如果你真的有一個布爾條件,使用布爾數據類型更清晰。但是,現在你有一個「只有兩個值」的值列表。經驗表明,在你的程序的整個生命週期中,真相會比你想象的更頻繁地發生變化(也許「通過」和「失敗」會得到諸如「不完整採訪」等其他值)。

+0

感謝您的幫助。我已經更新了OP。如果我使用TINYINT,是否將表單上的「value」設置爲整數,然後記住數字在數據庫的tiny int列中代表什麼?如果你有時間,你是否介意再看看OP ... – Leahcim

+0

謝謝,我應該說我不是一個真正的開發人員,所以當你說業務層必須生成值時,你的意思有點不清楚你的UI ... – Leahcim

+0

@Michael:一種常見的開發模式是讓UI代碼與業務對象交談,並讓業務對象與數據庫對話。請參閱http://en.wikipedia.org/wiki/Multitier_architecture。您只需要在一個地方定義事物以簡化維護並減少出錯的機率。如果您不知道如何創建業務層,那麼可以「記住」0和1代表什麼。如果你在用戶界面的每個地方都一致,你應該沒問題。如果您不使用業務對象層,則可以使用MySQL枚舉而不是tinyint。 –

1

一般來說,enum類型會支持最好的收音機,但由於您的選項是通過/失敗,您可以使用bool

+0

感謝您的幫助,我更新了OP。如果我使用布爾值,是否必須將窗體上的「值」設置爲1或0?但是如果我使用Enum,我將webform上的值設置爲枚舉字段中的相同名稱? – Leahcim