資料庫欄位如下,請用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;
}
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;
}