:::
5-3-1 將所有文章變成二維陣列
- 修改
index.php,並定義一個$all_news陣列,然後將每讀取出來一筆的文章,都放入$all_news中$all_news[0]代表第一篇文章$all_news[0]['title']則代表第一篇文章的標題
- 如此,
$all_news就是一個二維陣列,包含有所有文章的內容(檔案需額外處理),接著用assign()將所有文章送至樣板檔。<?php require_once 'header.php'; try { // 準備SQL語句 $sql = "SELECT * FROM `news` ORDER BY `date` DESC"; // 預備語句 $stmt = $pdo->prepare($sql); // 綁定參數並執行語句 $stmt->execute(); $all_news = []; $news = $stmt->fetchAll(); foreach ($news as $row) { $media = $row['media']; unset($row['media']); $row = array_map('htmlspecialchars', $row); $row['files'] = json_decode($media, true); $all_news[] = $row; } $smarty->assign('all_news', $all_news); } catch (PDOException $e) { echo "資料庫連接錯誤:" . $e->getMessage(); } $smarty->display('index.tpl'); -
此外,執行的 SQL 語法,使用
date日期欄位做排序,DESC就是從大排到小,最新的文章才會列在第一個。 -
資料表的名稱或欄位可以用
`名稱`包起來,避免有保留字問題(例如 date) -
由於
$row['media']是 json 格式,所以會包含引號,若是被htmlspecialchars過濾,可能會導致無法解析,故我們先將之存為$media,待所有內容過濾後,再利用原始的檔案 json 資訊$media,透過json_decode()來拆解為 array 陣列並存入$row['files']中供樣板呼叫使用。 -
至此,所有文章內容已經送到
index.tpl,接著就修改樣板檔以便讀取出真正的內容 -
若欲觀察
$all_news陣列內容,可以用 die() 搭配 var_export() 使用,前者停止程式,後者顯示變數內容die(var_export($all_news)); - 若覺得畫面不美觀,可以自行加入以下函數,然後用
dd($all_news) ;即可用美觀的畫面觀看變數內容(chrome 系列瀏覽器可以至此安裝,edge可裝這個)// 顯示變數內容 function dd($array = []) { header("Content-Type: application/json; charset=utf-8"); die(json_encode($array, 256)); }
5-3 顯示所有文章摘要