Pages

Subscribe:

Ads 468x60px

Labels

2015年5月6日 星期三

【教學】 PHP多個核取方塊如何放到同一個欄位

資料來源 飛肯設計學苑
緣 起:

   先說廢話,我在織夢線上發現有很多大大都在問說如何利用多個核取方塊放到同一個欄位,老實說我對這功能並不感興趣,因為我覺得這樣做並不實用,所以我原本是不打算寫教學的,直到前幾天有位織夢線上的大大寫封MAIL給我,信的內容是他現在在做學校的畢業專題,遇到了多個核取方塊如何放到同一個欄位的問題,希望我能指導他,信的內容不但把他所遇到的問題寫的很詳細,且有提出他的想法(也就是他想到的結決方法)且有抓圖說明,讓我覺得他是真的有心想學習,而非只是為了要交作業而已,所以我才決定寫這一篇"多個核取方塊如何放到同一個欄位教學",希望能對有需要的大大有所幫助,好了,不廢話進入主題了。
第1步:新增一個"delfile"資料庫。

第2步:新增一個"checkbox"資料表。

第3步:新增"id"及"checkbox"二個欄位,id為主鍵、型態為int、自動編號;checkbox為記錄興趣欄位,型態為varchar、長度為200。

第4步:新增一張表單。

第5步:新增八個核取方塊如下圖,核取方塊名稱用checkbox[](八個核取方塊名稱都要用用checkbox[]),表示我們要用陣列處理。

第6步:核取的值輸入若使用者選取該核取方塊時,所要寫入資料庫的值。

第7步:選取form標籤。

第8步:伺服器行為 ---> 插入記錄。

第9步:把checkbox欄和隨便一個FORM.checkbox[]配對,並把送出為改為'文字'(一定要記得改喔!)。

第10步:插入後,請前往的部份選ok.php。

第11步:把index.php切換至'程式碼'編輯模式。

第12步:找到這一段 if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {。

第13步:在剛剛那一段下方新增下列的程式碼。

foreach($_POST['checkbox'] as $box) {

$box2 .= $box;


我解釋一下這一段的意思好了,foreach()是PHP用來處理陣列的特有迴圈,詳細的用法我在我上一篇的[一次刪除複數檔案]的教學中解釋過了,在此不再贅述,有興趣的大大請自行參閱該教學。
在這一段最重要的在這一句'$box2 .= $box; ',一般PHP的要指派值給變數都是用=(等於)不過在此卻是用.=(在等於之前多一個點),在PHP中=是用來指派變數值,但同一個變數若指派給二種不同的值,新值會覆蓋舊值,用echo輸出時只會輸出新值,不會輸出舊值,在PHP中.=是用累加的方法來指派值,所以新值與舊值都會存在,因為我們須將所有陣列的值合併成同一個值,以能插入同一個欄位,所以要用.=來作。
第14步:把

$insertSQL = sprintf("INSERT INTO checkbox (checkbox) VALUES (%s)",
GetSQLValueString($_POST['checkbox[]'], "text"));

改成

$insertSQL = sprintf("INSERT INTO checkbox (checkbox) VALUES (%s)",
GetSQLValueString($box2, "text"));

我解釋一下這一段的意思好了,我們要插入checkbox欄位的值,已經變成$box2了,而不是$_POST['checkbox']所以要改成我上述的樣子。

第15步:簡單吧!只改4行字就完成了,我們來測試看看!

第16步:嗯!果然成功了。

第17步:去資料庫看看,剛剛 選取的資料有無插入資料庫中,果然成功寫入資料庫,YA!成功。

第18步:在ok.php的頁面新增一個資料集,把剛剛輸入的資料庫資料取出,以確定我們真的成功了。

其實這個步驟可以不用作,我會這樣做的原因是要讓各位大大知道,如果用剛剛的方法去作,所有的輸出資料都會擠在一起,不但不美觀且不實用(因為無關鍵字,所以無法把字串拆成陣列),那要怎麼辦呢?請繼續往下看。

第19步:找到我們剛剛改的那段程式。

foreach($_POST['checkbox'] as $box) { $box2 .= $box;} 

把它改成

for($i=0;$i < count($_POST['checkbox']);$i++) {

if(count($_POST['checkbox'])==1) {

$box2=$_POST['checkbox'][$i];

}elseif($i == (count($_POST['checkbox'])-1)) {

$box2.=$_POST['checkbox'][$i];

}elseif($i < count($_POST['checkbox'])) {

$box2.=$_POST['checkbox'][$i];

$box2.='、';


這樣就可以了。我解釋一下程式碼的意思好了,我們改用for迴全圈來跑陣列(for迴圈用法請自行參閱相關資料,不在此解釋之),並在迴圈內新增3個判斷式,為什麼要新增3個判斷式呢?且聽我道來。



第一個判斷式:if(count($_POST['checkbox'])==1) ,先說count這個函式好了,它是一個統計函式,用以統計陣列中有幾筆資料,再來說說判斷式的內容,這個判斷式為真的條件是,當陣列的資料只有一筆時,不用多作處理,直接去執行$box2=$_POST['checkbox'][$i];這一段,也就是把表單變數指派給變數$box2,好讓dw把$box2的值插入checkbox欄位,也就是直接去執行步驟14,而不需要使用第三個判斷式內的方法處理。



第二個判斷式:elseif($i == (count($_POST['checkbox'])-1)) {,當第一個判斷式不成立,就會去比對第二個判斷式是否成立,而這個判斷式為真的條件是當 $i 的值等於$_POST['checkbox']陣列的資料總筆數減1的值時,就會去執行$box2.=$_POST['checkbox'][$i];,先說一下為什麼要用$_POST['checkbox']陣列的資料總筆數減1的值去和 $i 比對,因為 $i 的值代表的是陣列的索引鍵值,因為陣列若不指定索引鍵的值會自動從'0'開始,而統計函數統計出來的值卻是從'1'開始,2者差1,所以當 $i 的值等於$_POST['checkbox']陣列的資料總筆數減1的值時,表示是陣列的最後一筆資料了,直接累加資料就可以,不需使用第三個判斷式內的方法處理。



第三個判斷式:elseif($i < count($_POST['checkbox'])) {,當第一及第二個判斷式不成立,就會去比對第三個判斷式是否成立,而這個判斷式為真的條件當 $i 的值小於$_POST['checkbox']陣列的資料總筆數時(也就是不是陣列最後一資料時),去執行

$box2.=$_POST['checkbox'][$i];

$box2.='、';

這二行的意思就是說,變數$box2的值為累加的$_POST['checkbox'][$i]陣列值,因為我們是用迴圈處理陣列,所以在迴圈重覆之前我們把變數$box2的值再累加一個 '、' 的值上去,然後再去重覆迴圈,而當第一及第二個判斷式成立時不會累加 '、' 這個值上去,這麼做有什麼用處呢?繼續看下去你就知道了。

第20步:新增一筆資料。

第21步:把步驟17的資料集所輸出的資料改用重覆區域輸出,看看二者有什麼不同。

第22步:開啟ok.php的頁面並切換到程式碼編輯。

第23步:找到。

第24步:把修改如下:

$check = split('、',$row_Recordset1['checkbox']);

foreach($check as $check2) {

echo $check2;

echo '
';

}

我解釋一下這一段的意思好了, split()函式是用來分割字串的,而 '、' 就是要分割的條件,$row_Recordset1['checkbox']就是要被分割的字串,分格完後會自動以陣列方式儲存並指派給變數$check,然後用foreach迴圈輸出值,這一段其實可以不用作,我會這樣作的原因主要是要讓各位大大知道沒有 '、' (第一種方法)與有 '、' (第二種方法)差別在那?因為第一種方法沒 '、' 當分割關鍵值,所以無法分割字串,我們來看看成果吧!

第25步:囉!這就是結果。
PS:其實我也不贊成這種作法,因為將來要updata會很麻煩,且就如gordon大大在篇討論中的說明[url]http://www.dreamweaver.com.tw/forumD...p?main_id=5374[/url],這不符合正規化原則,其實我覺得用gordon大大說的那個方法會比較好一點。

沒有留言:

張貼留言