:::

5-3-1 將所有文章變成二維陣列

  1. 修改 index.php,並定義一個 $all_news 陣列,然後將每讀取出來一筆的文章,都放入 $all_news
    1. $all_news[0] 代表第一篇文章
    2. $all_news[0]['title'] 則代表第一篇文章的標題
  2. 如此,$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');
    

     

  3. 此外,執行的 SQL 語法,使用 date 日期欄位做排序,DESC 就是從大排到小,最新的文章才會列在第一個。

  4. 資料表的名稱或欄位可以用 `名稱` 包起來,避免有保留字問題(例如 date)

  5. 由於 $row['media'] 是 json 格式,所以會包含引號,若是被 htmlspecialchars 過濾,可能會導致無法解析,故我們先將之存為 $media,待所有內容過濾後,再利用原始的檔案 json 資訊 $media,透過 json_decode() 來拆解為 array 陣列並存入 $row['files'] 中供樣板呼叫使用。

  6. 至此,所有文章內容已經送到 index.tpl,接著就修改樣板檔以便讀取出真正的內容

  7. 若欲觀察 $all_news 陣列內容,可以用 die() 搭配  var_export() 使用,前者停止程式,後者顯示變數內容

    die(var_export($all_news));

     

  8. 若覺得畫面不美觀,可以自行加入以下函數,然後用 dd($all_news) ; 即可用美觀的畫面觀看變數內容(chrome 系列瀏覽器可以至此安裝,edge可裝這個
    // 顯示變數內容
    function dd($array = [])
    {
        header("Content-Type: application/json; charset=utf-8");
        die(json_encode($array, 256));
    }

     


:::

書籍目錄

展開 | 闔起

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

計數器

今天: 2066206620662066
昨天: 2848284828482848
總計: 7915616791561679156167915616791561679156167915616