:::
4-5 更新資料(寫入檔案資訊)
-
最後,我們需要把這個 json 資訊存入資料庫,所以會用到更新資料的SQL語法:
UPDATE `資料表名稱` SET `欄位1`='值1', `欄位2`='值2', ... [WHERE 篩選條件] [LIMIT 筆數]以我們的例子就是:
// 更新該文章的 media 欄位值 $updateSql = "UPDATE news SET media = ? WHERE id = ?"; $updateStmt = $pdo->prepare($updateSql); $updateStmt->execute([$media, $lastInsertId]); -
儲存後,我們必須轉向,避免一直停留在新增的狀態,所以,會用
header("location: 轉向位址");將畫面導向到另一頁(用header()之前不可以有任何輸出,故須將「資料已成功儲存」訊息刪除)。//執行後轉向 header("location: admin.html?op=show&id=$id"); exit;我們目前儲存後暫時轉到發布界面
admin.html以方便繼續發布,因為前台還未完成(?op=show&id=$id則是練習一下get帶參數的傳遞方法,目前尚無作用。將會傳遞兩個參數,分別是用來告之下個欲執行動作的$_GET['op']及文章編號$_GET['id'])。
三、目前完整語法
- 請試著發布幾篇文章看看,也記得順便上傳幾個檔案試試
<?php // 建立PDO連線 $dbname = 'blog'; $host = 'localhost'; $charset = 'utf8mb4'; $username = 'root'; $password = '1qazXSW@'; // 處理檔案上傳 $uploadDir = 'uploads/'; // 上傳目錄 // 處理表單提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 取得表單的值 $title = $_POST['title']; $content = $_POST['content']; $author = $_POST['author']; $date = $_POST['date']; $category = $_POST['category']; // 建立資料庫連接 $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset"; try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 準備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]); } //執行後轉向 header("location: admin.html?op=show&id=$lastInsertId"); exit; } else { echo "資料插入失敗!"; } } catch (PDOException $e) { echo "資料庫連接錯誤:" . $e->getMessage(); } } - 資料可以先直接到 adminer 去看看有無寫入資料即可,檔案則是查看 uploads 下有無檔案就知道了
4-4 檔案上傳與接收