:::
7-1 取得指定的新聞資料數
- 首先,一樣請AI來代勞:
資料庫欄位如下,請用PHP8製作一個函數 all(),可以指定要從第幾筆開始,列出幾筆資料,並依照日期由新到舊排序,最後傳出資料陣列。 參數請用用?佔位符的方式處理 有json格式的欄位,也請轉成陣列,最後傳回該筆資料的所有值。 資料需要過濾,包括json轉陣列的欄位,避免XSS攻擊 資料庫物件$pdo已經存在,無須重新執行資料庫連線。 CREATE TABLE `school_news` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '編號', `news_title` VARCHAR(255) NOT NULL COMMENT '新聞標題', `news_content` TEXT NOT NULL COMMENT '新聞內容', `related_link` VARCHAR(255) COMMENT '相關連結', `publisher` VARCHAR(100) NOT NULL COMMENT '發布者', `school_name` VARCHAR(100) NOT NULL COMMENT '學校名稱', `report_date` DATE NOT NULL COMMENT '報導日期', `upload_type` ENUM('image', 'youtube') NOT NULL COMMENT '上傳種類', `youtube_url` VARCHAR(255) COMMENT 'Youtube影片網址', `media` JSON COMMENT '多檔案JSON資訊', `views` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '點閱數', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - 最後得到:
function all(int $start = 0, int $limit = 10): array { global $pdo; $query = "SELECT * FROM school_news ORDER BY report_date DESC LIMIT ?, ?"; $stmt = $pdo->prepare($query); $stmt->bindValue(1, $start, PDO::PARAM_INT); $stmt->bindValue(2, $limit, PDO::PARAM_INT); $stmt->execute(); $results = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 處理JSON欄位 if (isset($row['media']) && !empty($row['media'])) { $row['media'] = json_decode($row['media'], true); } // XSS過濾 array_walk_recursive($row, function(&$item) { if (is_string($item)) { $item = htmlspecialchars($item, ENT_QUOTES, 'UTF-8'); } }); $results[] = $row; } return $results; } - 由於列表也會用到輪播圖,所以,一樣加入圖片的json內容,以及主要圖片設定,另外也取得主要的縮圖
function all(int $start = 0, int $limit = 10): array { global $pdo; $query = "SELECT * FROM school_news ORDER BY report_date DESC LIMIT ?, ?"; $stmt = $pdo->prepare($query); $stmt->bindValue(1, $start, PDO::PARAM_INT); $stmt->bindValue(2, $limit, PDO::PARAM_INT); $stmt->execute(); $results = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 處理JSON欄位 if (isset($row['media']) && !empty($row['media'])) { $row['media'] = json_decode($row['media'], true); } // XSS過濾 array_walk_recursive($row, function (&$item) { if (is_string($item)) { $item = htmlspecialchars($item, ENT_QUOTES, 'UTF-8'); } }); $row['media_json'] = convertMediaToJson($row['media']); $row['main_image'] = array_key_first($row['media']); $row['thumb_image'] = reset($row['media']); $results[] = $row; } return $results; }
7. 製作首頁列表功能