:::

7. 後台發布文章界面

  1. 編輯 admin.php
  2. 加上該有的變數過濾,$op 的預設值可以暫時用 create,也就是建立文章的意思,等會兒得用他來引入樣板。
    // 變數過濾
    $op = isset($_REQUEST['op']) ? htmlspecialchars($_REQUEST['op']) : 'create';

     

  3. 加上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;
    }
    
  4. 將儲存部份做成 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();
            }
        }
    }
  5. 記得 global $pdo, $uploadDir 以便在函式中使用
  6. 修改 config.php
    <?php
    // PDO連線設定
    $dbname = 'blog';
    $host = 'localhost';
    $charset = 'utf8mb4';
    $username = 'root';
    $password = '1qazXSW@';
    // 每頁顯示文章數
    $perPage = 3;
    // 分類設定
    $categories = [
        1 => '校園日誌',
        2 => '榮譽榜',
        3 => '媒體新聞',
        4 => '重要資訊',
    ];
    // 上傳目錄
    $uploadDir = 'uploads/';
    

     

  7. 暫時還是使用 admin.tpl 樣板來呈現畫面,同時務必也將 $op 值送至樣板,因為我們要靠它引入子樣板。
    $smarty->assign('op', $op);
    $smarty->assign('categories', $categories);
    $smarty->assign('year_count', year_count());
    $smarty->display('admin.tpl');

     

  8. 最後看起來像這樣:
    <?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();
            }
        }
    }
    

     


:::

書籍目錄

展開 | 闔起

https%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D52%26tbdsn%3D1830

計數器

今天: 2925292529252925
昨天: 3438343834383438
總計: 7393254739325473932547393254739325473932547393254