:::
7. 後台發布文章界面
- 編輯
admin.php - 加上該有的變數過濾,
$op的預設值可以暫時用create,也就是建立文章的意思,等會兒得用他來引入樣板。// 變數過濾 $op = isset($_REQUEST['op']) ? htmlspecialchars($_REQUEST['op']) : 'create'; - 加上
switch()流程控制,暫時不需要有default也沒關係(若要有也應該是執行create建立文章的動作),執行儲存後,可以利用傳回的$id編號,將畫面重新導引到index.php其顯示文章畫面。switch ($op) { case 'store': $id = store(); //執行後轉向 header("location: index.php?op=show&id=$id"); exit; default: $op = 'create'; break; } - 將儲存部份做成
store()函式,並傳回流水號$id(流程會用到),轉向部份移至流程處理,改為傳回流水號,目錄設定則移至config.php// 處理表單提交 function store() { global $pdo, $uploadDir; if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 取得表單的值 $title = $_POST['title']; $content = $_POST['content']; $author = $_POST['author']; $date = $_POST['date']; $category = $_POST['category']; try { // 準備SQL語句 $sql = "INSERT INTO news (title, content, author, date, category, media) VALUES (?, ?, ?, ?, ?, ?)"; // 預備語句 $stmt = $pdo->prepare($sql); // 綁定參數並執行語句 $stmt->execute([$title, $content, $author, $date, $category, '[]']); // 取得插入的資料行數 $rowCount = $stmt->rowCount(); if ($rowCount > 0) { // 取得插入的 id 值 $lastInsertId = $pdo->lastInsertId(); // 建立存放圖檔的目錄 $articleDir = $uploadDir . $lastInsertId . '/'; if (!file_exists($articleDir)) { mkdir($articleDir, 0777, true); } // 處理多檔案上傳 if (!empty($_FILES['media'])) { $fileData = array(); foreach ($_FILES['media']['name'] as $index => $fileName) { $fileTmpName = $_FILES['media']['tmp_name'][$index]; $fileDestination = $articleDir . $fileName; // 將檔案移動到文章檔案目錄 move_uploaded_file($fileTmpName, $fileDestination); // 將檔案路徑存入陣列 $fileData[$fileName] = $fileDestination; } // 將檔案相關資訊轉換為JSON格式 $media = json_encode($fileData, 256); // 更新該文章的 media 欄位值 $updateSql = "UPDATE news SET media = ? WHERE id = ?"; $updateStmt = $pdo->prepare($updateSql); $updateStmt->execute([$media, $lastInsertId]); } return $lastInsertId; } else { echo "資料插入失敗!"; } } catch (PDOException $e) { echo "資料庫連接錯誤:" . $e->getMessage(); } } } - 記得
global $pdo, $uploadDir以便在函式中使用 - 修改
config.php<?php // PDO連線設定 $dbname = 'blog'; $host = 'localhost'; $charset = 'utf8mb4'; $username = 'root'; $password = '1qazXSW@'; // 每頁顯示文章數 $perPage = 3; // 分類設定 $categories = [ 1 => '校園日誌', 2 => '榮譽榜', 3 => '媒體新聞', 4 => '重要資訊', ]; // 上傳目錄 $uploadDir = 'uploads/'; - 暫時還是使用
admin.tpl樣板來呈現畫面,同時務必也將$op值送至樣板,因為我們要靠它引入子樣板。$smarty->assign('op', $op); $smarty->assign('categories', $categories); $smarty->assign('year_count', year_count()); $smarty->display('admin.tpl'); - 最後看起來像這樣:
<?php require_once 'header.php'; // 變數過濾 $op = isset($_REQUEST['op']) ? htmlspecialchars($_REQUEST['op']) : 'create'; switch ($op) { case 'store': $id = store(); //執行後轉向 header("location: index.php?op=show&id=$id"); exit; default: $op = 'create'; break; } $smarty->assign('op', $op); $smarty->assign('categories', $categories); $smarty->assign('year_count', year_count()); $smarty->display('admin.tpl'); // 處理表單提交 function store() { global $pdo, $uploadDir; if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 取得表單的值 $title = $_POST['title']; $content = $_POST['content']; $author = $_POST['author']; $date = $_POST['date']; $category = $_POST['category']; try { // 準備SQL語句 $sql = "INSERT INTO news (title, content, author, date, category, media) VALUES (?, ?, ?, ?, ?, ?)"; // 預備語句 $stmt = $pdo->prepare($sql); // 綁定參數並執行語句 $stmt->execute([$title, $content, $author, $date, $category, '[]']); // 取得插入的資料行數 $rowCount = $stmt->rowCount(); if ($rowCount > 0) { // 取得插入的 id 值 $lastInsertId = $pdo->lastInsertId(); // 建立存放圖檔的目錄 $articleDir = $uploadDir . $lastInsertId . '/'; if (!file_exists($articleDir)) { mkdir($articleDir, 0777, true); } // 處理多檔案上傳 if (!empty($_FILES['media'])) { $fileData = array(); foreach ($_FILES['media']['name'] as $index => $fileName) { $fileTmpName = $_FILES['media']['tmp_name'][$index]; $fileDestination = $articleDir . $fileName; // 將檔案移動到文章檔案目錄 move_uploaded_file($fileTmpName, $fileDestination); // 將檔案路徑存入陣列 $fileData[$fileName] = $fileDestination; } // 將檔案相關資訊轉換為JSON格式 $media = json_encode($fileData, 256); // 更新該文章的 media 欄位值 $updateSql = "UPDATE news SET media = ? WHERE id = ?"; $updateStmt = $pdo->prepare($updateSql); $updateStmt->execute([$media, $lastInsertId]); } return $lastInsertId; } else { echo "資料插入失敗!"; } } catch (PDOException $e) { echo "資料庫連接錯誤:" . $e->getMessage(); } } }
6-5 讀出指定年度的文章