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));
}