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();
}
}
}