很多朋友都在問,要如何一次刪除複數檔案,小弟看一直無人寫教學,所以野人獻曝一下,於是寫了一篇PHP刪除複數檔案的教學,與各位大大分享討論,廢話不多說,馬上進入主題;我這個範例資料庫名稱為"delfile",資料表名稱為"file_id",欄位1名稱為"del_id"(主鍵、自動編號), 欄位2名稱為"del_photo"(用以記錄檔案名稱及副檔名),而圖片檔案放在"photo"這個資料夾底下。
步驟1:新增一個資料集,查詢" file_id" 資料表中的檔案資料。
步驟2:新增一個核取方塊欄位,名稱為"del_id[]",核取值為資料庫的"del_id"欄位 (主鍵)。註:因為刪除複數檔案需用到陣列,而"[]"在PHP中代表的意思就是陣列,所以名稱為"del_id[]"。
步驟3:設定表單接收的頁面,範例是"ok_del.php"。
步驟4:在"ok_del.php"頁面新增一個資料集,篩選條件為"del_id"欄位等於表單變數,再來按進階。
步驟5:找到"$_POST['del_id']"。
步驟6:把原本的"$_POST['del_id']"換成"$photo_id"。
註:"$_POST['del_id']"是PHP接收表單變數的方法,不過因為我們等下要用一個PHP專屬處理陣列的迴圈,所以要把"$_POST['del_id']"換成"$photo_id",原因我稍後會說明。
步驟7:找到下面這一段程式。$colname_recphoto = "1";
if (isset($photo_id)) {
$colname_recphoto = (get_magic_quotes_gpc()) ? $photo_id : addslashes($photo_id);
}
mysql_select_db($database_recdelfile, $recdelfile);
$query_recphoto = sprintf("SELECT * FROM file_id WHERE del_id = %s", $colname_recphoto);
$recphoto = mysql_query($query_recphoto, $recdelfile) or die(mysql_error());
$row_recphoto = mysql_fetch_assoc($recphoto);
$totalRows_recphoto = mysql_num_rows($recphoto);
?>
步驟8:在"$colname_recphoto = "1";"上方新增下面一段程式。
foreach($_POST['del_id'] as $photo_id) { 接著在 "?>" 上方新增一個 "}" 符號,使程式變成如下列所示。
foreach($_POST['del_id'] as $photo_id) {
$colname_recphoto = "1";
if (isset($photo_id)) {
$colname_recphoto = (get_magic_quotes_gpc()) ? $photo_id : addslashes($photo_id);
}
mysql_select_db($database_recdelfile, $recdelfile);
$query_recphoto = sprintf("SELECT * FROM file_id WHERE del_id = %s", $colname_recphoto);
$recphoto = mysql_query($query_recphoto, $recdelfile) or die(mysql_error());
$row_recphoto = mysql_fetch_assoc($recphoto);
$totalRows_recphoto = mysql_num_rows($recphoto);
}
?>
我解釋一下新增這二行程式碼的意思好了。"foreach()" 是專屬PHP特有的迴圈,專門用於處理陣列,它的用法就是"foreach(陣列名稱 指派給 變數名稱 )",範例如下:
foreach($_POST['del_id'] as $photo_id) ,這一段程式碼的意思就是把"$_POST['del_id']"這個陣列的值指派給"$photo_id"這個變數,而這也就是為什麼在步驟6的時候,要把原本的"$_POST['del_id']"換成"$photo_id"的原因,因為"$_POST['del_id']"的指已經指派給"$photo_id"所以要用"$photo_id"當篩選條件,而不是"$_POST['del_id']",那為什麼要用"foreach()"迴圈,而不用其他的迴圈呢?其實要用其他的迴圈一樣可以,只是就如我先前所言,"foreach()" 是專屬PHP特有的迴圈,專門用於處理陣列,那我們用它來處理陣列是最好不過的,它會自動讀取下一筆資料,直到陣列內沒有資料為止,而在 "?>" 上方新增一個 "}" 符號的意思,代表迴圈內的程式到此結束,不過要注意一點,"foreach()"迴圈是從php4後才有的函式,不過應該沒有人在用php4之前的版本了吧!
步驟9:新增二行程式於"$totalRows_recphoto = mysql_num_rows($recphoto);"下方。
$photo = $row_recphoto['del_photo']; unlink("photo/$photo");
我解釋一下新增這二行程式碼的意思好了。新增一個"$photo"變數,而它的值為資料集中的"del_photo"欄位,也就是說把圖片檔案名稱與副檔名指派給"$photo"這個變數。而"unlink()"這個函式是用於刪除檔案用的,其語法為"unlink("要刪除的檔案存放路徑與要刪除的檔案名稱");",範例如下:
unlink("photo/$photo");
因為我們圖片檔案放在"photo"資料夾底下,而"$photo"的值等於圖片檔案名稱與副檔名,所以"unlink("photo/$photo");"的意思即為刪除"photo"資料夾底下指定的圖片檔案。
步驟10:複製下列程式碼,貼於 unlink("photo/$photo"); 後方。
mysql_select_db($database_recdelfile, $recdelfile);
$query_recphoto = sprintf("SELECT * FROM file_id WHERE del_id = %s", $colname_recphoto);
$recphoto = mysql_query($query_recphoto, $recdelfile) or die(mysql_error());
$row_recphoto = mysql_fetch_assoc($recphoto);
$totalRows_recphoto = mysql_num_rows($recphoto);
接著把程式改成
mysql_select_db($database_recdelfile, $recdelfile);
$query_recphoto2 = sprintf("DELETE FROM file_id WHERE del_id = %s", $colname_recphoto);
$recphoto2 = mysql_query($query_recphoto2, $recdelfile) or die(mysql_error());
$row_recphoto2 = mysql_fetch_assoc($recphoto2);
$totalRows_recphoto2 = mysql_num_rows($recphoto2);
我解釋一下所新增程式碼的意思好了。這段程式碼的重點在於 "$query_recphoto2 = sprintf("DELETE FROM file_id WHERE del_id = %s", $colname_recphoto);" 這一段。
這一段是SQL敘述句,是用以刪除資料庫中的記錄,我們在之前已經把圖片檔案刪除了,再來就是要把資料庫中的記錄也刪除,這樣的話整個刪除作業才算完成,而這一段的意思是說,去刪除" file_id"這個資料表中,"del_id"欄位內容的值等於變數"$colname_recphoto"的值,而變數"$colname_recphoto"的值又是什麼呢?我們往上看找到"$colname_recphoto = (get_magic_quotes_gpc()) ? $photo_id : addslashes($photo_id)";這一段,它的意思就是說把變數"$colname_recphoto"的值等於變數"$photo_id"的值,也就是說把變數"$photo_id"的值指派給變數"$colname_recphoto",而變數"$photo_id"的值就是等於前面"$_POST[del_id']"(表單變數)的值,也就是" file_id"這個資料表中的主鍵,這樣了解嗎?好了,這下圖片檔案與資料表中的記錄都刪除了,這樣就大功告成了,接下來我們就測試一下程式是否可正常執行。
步驟11:我們的資料庫與photo資料夾中各有10筆資料及10張圖片檔案,我們勾選最後三張作為刪除測試。
步驟12:果然,看見"檔案刪除成功!!"的字樣,嗯!我們回index.php看看檔案是不是真的刪除了。
步驟13:果然,原本的10張圖片檔案,現在只剩7張,圖片檔案刪除作業成功,那資料庫的記錄有一併刪除嗎?我們去確認一下。
步驟14:這是未執行刪除作業時"file_id"資料表的畫面(也就是說未執行步驟11時,資料表中的記錄),果然有10筆記錄。
步驟15:這是執行刪除作業後"file_id"資料表的畫面(也就是說執行步驟11後,資料表中的記錄),果然只剩7筆記錄,刪除記錄作業成功。
就先教到這裡,若有問題大家再提出來討論。
另外下面延伸閱讀推薦的那二本書也都有提到相同的內容,而且寫的更詳細,推薦給有需要的朋友。
延伸閱讀:
挑戰Dreamweaver CS4互動網站百寶箱:使用PHP
精通Dreamweaver CS4與PHP & MySQL實例整合應用經典
如果覺得這篇文章對您有所幫助,在觀看完文章之餘,希望能點選下方方廣告,當作是對YOGO的支持,讓YOGO更有寫作的動力。
沒有留言:
張貼留言