5-3
完成整個新增流程
預設情況是:
- 當使用者按下「發布新聞 」時,系統會執行
http://localhost/php8/admin.php,此時沒有任何參數
- 進入
admin.php 程序後,會先 require 'header.php'; 以便載入樣板引擎和連接資料庫
- 接著過濾外部傳來變數,並取得
$op 的值,用來讓 swtich($op) 判斷現在應該做什麼。
- 當
$op 為空值時,便會執行預設動作 default: 也就是將 create 指派給 $op( $op = "create";)。
- 接著會用
$smarty->assign('now_op', $op); 產生樣板變數 $now_op 並將 $op 的值 create 指定給 $now_op 並傳送到樣板檔。
- 最後用
$smarty->display('admin.tpl'); 告知PHP,要將所有變數送往 admin.tpl,並載入 create.tpl 子樣板以在主內容區顯示編輯界面。
當我們送出文章時,應該是:
- 當使用者在「發布新聞 」按下「提交」時,系統會將表單的值,用POST的方式傳送到
http://localhost/php8/admin.php
- 進入
admin.php 程序後,會先 require 'header.php'; 以便載入樣板引擎和連接資料庫
- 接著過濾外部傳來變數,並取得
$op 的值,用來讓 swtich($op) 判斷現在應該做什麼。
- 當
$op 為「store」時,便會執行預設動作 case 'store': 也就是執行將 store() 函數,以儲存文章,並上傳傳檔案和產生縮圖。
switch ($op) {
case 'store':
$id = store();
echo "新聞已成功保存,ID: " . $id;
break;
default:
$op = "create";
break;
}
接著會用 $smarty->assign('now_op', $op); 產生樣板變數 $now_op 並將 $op 的值 store 指定給 $now_op 並傳送到樣板檔。
最後用 $smarty->display('admin.tpl'); 告知PHP,要將所有變數送往 admin.tpl,並載入store.tpl 子樣板以在主內容區顯示???
修正錯誤流程
- 其實,上述流程第5、6都是不必要的
- 因為任何資料庫異動完成後,都應該進行轉向(否則,若是重新整理畫面,資料又會多一筆)
- 轉向一般就是轉到列表,或者該文章內容都行,視情況而定
- 一般我們用
header("location: 新位址"); 來進行轉向,轉向完為避免繼續執行底下動作(第5、6),我們可以直接用 exit; 來停止程式並完成轉向:
switch ($op) {
case 'store':
// 儲存資料
try {
$id = store();
header("Location: index.php?id={$id}");
exit;
} catch (Exception $e) {
echo "儲存失敗: " . $e->getMessage();
}
default:
// 編輯表單
$op = 'create';
break;
}
- 如此,新增後,便會直接導向到
index.php?id={$id} 也就是到 index.php 並帶一個 id 參數,指定要看某一篇文章