? >
介紹
checkbox是一個非常有用的頁面表單項,在讓使用者進行多重選擇的情況下,它甚至可以允許使用者選擇全部項目或是一個都不選。但是,儘管這是一個非常優秀的表單元素,但在我們的工作中,在如何正確地保存選擇項這方面總存在一些易混淆的情況發生。本文將描述在遵循好的資料庫設計原則的方法下,如何把checkbox選擇項正確地保存在資料庫中。
要求
本文將闡述如何把選擇項目正確地保存在使用者資料庫中的方法。儘管這裡包括了有用的PHP程式碼,但我將從資料庫設計的觀點來表達它們,所以,你可以很方便地使用任何一個資料庫和伺服器端腳本語言來實現。我只是想提供一個如何做的方法,讓你能應用於你自己的網站。如果你想運行這裡的原始碼,你需要安裝php、mysql和網頁伺服器。
例1:招聘站點
假如你被要求做一個招聘類的網站,允許求職的軟體開發人員填寫他們的技能,讓雇主能訪問這個站點並根據求職者的技能找到合適的員工。你也知道,一個開發人員擁有的技能會多於一個,因此你決定這樣設計你的網站。
每一個求職者將允許訪問本站,註冊一個用戶,並且輸入他的技能,Checkbox就派上用場了,你可能想作這樣的一頁:
__ PHP __ MySQL __ Zope
__ Perl __ Javascript __ JSP
[提交]
每一個求職都可以選擇他所擁有的技能。顯然對於不同人來說這選擇項是不同的。一個人可能會是PHP和Mysql,其它人可能只是JSP。你將如何保存這些選擇?一個很自然的想法是針對每個選項建立一個字段,這樣開始可以正常工作。但隨後你可能會發現,當你想擴展或調整時,麻煩就來了,你可能必須修改你的表結構。
好的方法應是這樣的:
你應有一個用戶表包含用戶的註冊信息,如用戶名、密碼和其它一些你需要的什麼內容。如果你直接使用本文後面給出的源碼,你要建立一個簡單的表如下:
id username
1 User1
2 User2
3 User3
我們先建一個表格"const_skills" 用如下的SQL 語句:
SQL> CREATE TABLE const_skills (
id int not null primary key,
value varchar(20) );
SQL> INSERT INTO const_skills(id, value) VALUES (1, "PHP");
SQL> INSERT INTO const_skills(id, value) VALUES (2, "MySQL ");
SQL> INSERT INTO const_skills(id, value) VALUES (3, "Zope");
SQL> INSERT INTO const_skills(id, value) VALUES (4, "Perl");
SQL> INSERT INTO const_skills(id, value) VALUES (5, "Javascript");
SQL> INSERT INTO const_skills(id, value) VALUES (6, "JSP");
你的const_lls>你的const_lls現在應是這樣的:
id value
1 PHP
2 MySQL
3 Zope
4 Perl
5 Javascript
6 JSP
這個表只是讓使用者可以選擇對應的技能,現在,再建一個表lookup_skills 用以下的SQL:
SQL> CREATE TABLE lookup_skills (
id int not null auto_increment primary key,
id int not null auto_increment primary key,
uid int not null auto_increment primary key,
uid int not null auto_increment primary key, uid int , skill_id int ); 這個表lookup_skills的目的是提供從用戶表到開發技能表之間的一個映射關係。換句話說,它讓我們保存開發者和他們擁有的技能,如,當求職者完成選擇點擊提交時,我們將填寫這個表用checkbox中被選定的那些值。每一個選上的技能,我們在這個表中加一筆記錄,記下用戶id及所選用的id。 (想必大家都清楚了吧。我譯到這,嘿嘿…) 在我們看這個插入記錄的代碼之前,我們先設計一下這個頁面,應有的內容有一個表單,我們可以查詢的資料庫並且取checkbox標籤從const_skills表中,建這個checkbox表單項目。
程式碼如下:
/* 在此插入連接資料庫的程式碼*/
/* 取得複選框標籤*/
$skills = get_checkbox_labels("const_skills");
/* 為一組格式化的
複選框建立html 程式碼*/
$html_skills = make_check_html($skills, 33 , 400, "skills[]");
? >
檢查您的網頁開發技能:
function get_checkbox_labels($table_name) {
/* 建立一個陣列*/
$arr = array();
/* 建構查詢* /
$query = "SELECT * FROM $table_name";
/* 執行查詢*/
$qid = mysql_query($query);
/* 結果集中的每一行都會被打包為
對象,放入數組中*/
while($row= mysql_fetch_object($qid)) {
array_push( $arr, $row);
}
array_push( $arr, $row);
}
回傳$arr;
}
/* 列印格式良好的複選框選項表。
$arr 是包含選項的物件陣列
$num 是我們在表格中顯示的元素寬度
$width 是表格標籤的寬度參數值
$name 是複選框數組的名稱
$checked 是應檢查的元素名稱數組
*/
function make_checkbox_html($arr, $num, $ width, $name, $checked) {
/* 建立字串來儲存html */
$str = "";
/* 製作它*/
$str .= "n";
$str .= "n";
/* 決定是否必須在表格末尾加上
結束tr 標記*/
if (count($arr) % $num != 0) {
$closeTR = true;
}
$i = 1;
if (isset($checked)) {
/* 如果我們傳入了一個複選框數組,我們希望
顯示為已選中*/
foreach ($arr as $ele) {
$str .= "id"";
foreach ($checked as $entry) {
if ($entry == $ele->value) {
$str .= "checked";
繼續;
}
}
$str .= " >";
$str .= "$ele- >value" ;
if ($i % $num == 0) {
$str .= "n";
} else {
$str .= "n";
}
$i ;
}
} else {
/* 我們只想列印複選框。沒有人會檢查*/
foreach ($arr as $ele) {
$str .= " id“>”;
$str .= "$ele- >value";
if ($i % $num == 0) {
$str .= " n";
} else {
$str .= "n";
}
$i ;
}
}
}
/* 如果需要,新增結束tr 標籤*/
if ($ openingTR == true) {
$str .= "< ;/tr>表>n";
} else {
$str .= "n";
}
回傳$str;
}