2009年7月1日

[教學]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切換至'程式碼'編輯模式。

第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 <>
$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 <> $box2.=$_POST['checkbox'][$i]; $box2.='、';

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

第20步:新增一筆資料。

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

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

第23步:找到 < ?php echo $row_Recordset1['checkbox']; ?>

第24步:把 < ?php echo $row_Recordset1['checkbox']; ?>修改如下:

$check = split('、',$row_Recordset1['checkbox']);
foreach($check as $check2) {
echo $check2;echo ' ';
}

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

第25步:囉!這就是結果。

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

如果覺得這篇文章對您有所幫助,在觀看完文章之餘,希望能點選下方方廣告,當作是對YOGO的支持,讓YOGO更有寫作的動力。

6 則留言:

伊蘇小勇者 提到...

天阿~~~

興趣資料塞在同一個欄位,用分隔符號隔開,就不叫做正規劃,
用八個欄位用(Y/N)的方式存放就叫做正規劃,
那當要加入第九個興趣時,還要改資料庫欄位 Orz

真是個優秀的正規化資料表~~~

YOGO 提到...

感謝伊蘇小勇者的意見,YOGO會在努力深造的^^

匿名 提到...

十分感激!對我們這種菜鳥來說,您的說明已經相當足夠!謝謝!clive

古仔 提到...

你好~我讀到把foreach修改成for的那一段:

for($i=0;$i <>
 if(count($_POST['checkbox'])==1) {
  $box2=$_POST['checkbox'][$i];
 }elseif($i == (count($_POST['checkbox'])-1)) {
  $box2.=$_POST['checkbox'][$i];
 }elseif($i <>
  $box2.=$_POST['checkbox'][$i];$box2.='、';
 }
}
-----------------
請問這部分code是不是有少?好像括弧跟條件都和不太起來的說@@

YOGO 提到...

感謝你的回報,已修正

羅元佳 提到...

您好,參考您的做法把foreach改成for那邊
for($i=0;$i
$box2.=$_POST['checkbox'][$i];$box2.='、';
}
}
我出現在$box2.=$_POST['checkbox'][$i];$box2.='、'; 這行有錯誤
但我不清楚是哪邊出了錯誤
還請指教一下謝謝^^

聖誕跑趴歡樂降★韓版假兩件針織連衣裙$890,新款顯瘦棒球服連帽風衣外套下殺$510,冬新款歐美棉襖棉服連帽短款外套限量↘$530,秋冬新款韓版大碼毛領氣質毛料外套↘$680,快上左耳貓網路購物

您好!如圖太小看不清楚,請 點選此處 看詳細內容 左耳貓蝦皮賣場 https://shopee.tw/hrf5168 左耳貓 露天賣場 http://class.ruten.com.tw/user/index00.php?s=starbox 左耳貓粉...