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更有寫作的動力。

【教學】 用DW製作PHP版刪除檔案教學



如何將server端的檔案刪除,也就是刪除資料後,一併將該相關檔案刪除:

舉例:index.php、photodel.php兩個網頁

資料庫欄位舉例:p_id(自動編號、主鍵)、p_name(紀錄檔案名稱及副檔名)

存放檔案的路徑:photo/

步驟一:在index.php頁面的表單插入二個隱藏欄位,p_id及p_name,而其值分別是資料庫欄位的p_id及p_name。

驟二:index.php頁面做法跟刪除資料的做法與設定一樣,然後主索引鍵值選"表單變數"旁邊的空白欄位輸入p_id,全都設定好之後按下確定後,在程式碼內容裡加上下面一段語法:先找到這一行:

先找到這一行:

$Result1 = mysql_query($deleteSQL, $delfile) or die(mysql_error());

在這一行之後,在找到這一行:

$deleteGoTo = "photodel.php";

在這二行中間的任何一個地方,加上下面二行程式碼

$photo = $_POST['p_name'];
unlink("photo/$photo");

這樣只要一個頁面就完成了,這個程式主要的重點在於unlink()這個函式,它的作用就是叫php去刪除指定的檔案,而它的函式原型如下:

unlink("要刪除的檔案存放路徑與要刪除的檔案名稱");


那為什麼要放在

$Result1 = mysql_query($deleteSQL, $delfile) or die(mysql_error());

之後

$deleteGoTo = "photodel.php";

之前呢?其實只要放在

header(sprintf("Location: %s", $deleteGoTo));

一行之前先執行unlink()函式就可以了,因為

header(sprintf("Location: %s", $deleteGoTo));

這一行的意思就是轉址,轉向你原本在刪除記錄後所要前往的網頁,所以unlink()函式一定要在

header(sprintf("Location: %s", $deleteGoTo));

之前執行,而為什麼要放在

$Result1 = mysql_query($deleteSQL, $delfile) or die(mysql_error());

之後,主要是因為if判斷式的關係,在你插入刪除記錄行為的時候,dw會自動加入一個if判斷式,判斷表單變數是否存在,而會要在

$Result1 = mysql_query($deleteSQL, $delfile) or die(mysql_error());

之後,主要是要確保unlink()這個函式會在if判斷式之內,避免程式發生錯誤。

另外下面延伸閱讀推薦的那二本書也都有提到相同的內容,而且寫的更詳細,推薦給有需要的朋友。

延伸閱讀:

挑戰Dreamweaver CS4互動網站百寶箱:使用PHP

精通Dreamweaver CS4與PHP & MySQL實例整合應用經典

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




寺廟巡禮免費廟宇開站即將開放

讓各位久等了, 寺廟巡禮系統目前正火速趕製中, 目前先釋出最新進度的樣板 本系拱採永久免費製, 供有興趣的朋友參考, 可至下方網頁預約申請   寺廟巡禮系統線上說明 http://www.iwa.com.tw/   寺廟巡禮系統線上樣板 http://...