:::

4. 加入登入及管理功能

一、 本週要做的事

  1. 隨機背景(請參考第二週講義第八點)
  2. 將PHP的設定檔、頁首、頁尾檔獨立出來(請參考第三週講義第十四點)
  3. 將樣板的頁首、頁尾檔、選單獨立出來(請參考第三週講義第十五點)

二、 讀出單一文章

  1. switch流程的default:中,加入一組有無$sn的判斷,若有,顯示一篇文章,若無,顯示所有文章。記得在switch之前針對$sn外部變數做過濾。
  2. 內容換行可用nl2br()來處理,如:
    $article['content'] = nl2br($article['content']);
  3. 在樣板中,可以針對不同$op,載入不同子樣板。

三、 加入登入機制

  1. 官網:https://github.com/fethica/PHP-Login 中的releases下載PHP-Login-2.0.zip,解壓後將PHP-Login/login下的所有目錄檔案複製到reporter下即可。
  2. 進入Adminer,點擊「SQL命令」貼語法建立membersloginAttempts兩個資料表
    CREATE TABLE `members` (
      `id` char(23) NOT NULL,
      `username` varchar(65) NOT NULL DEFAULT '',
      `password` varchar(65) NOT NULL DEFAULT '',
      `email` varchar(65) NOT NULL,
      `verified` tinyint(1) NOT NULL DEFAULT '0',
      `mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      UNIQUE KEY `username_UNIQUE` (`username`),
      UNIQUE KEY `id_UNIQUE` (`id`),
      UNIQUE KEY `email_UNIQUE` (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `loginAttempts` (
      `IP` varchar(20) NOT NULL,
      `Attempts` int(11) NOT NULL,
      `LastLogin` datetime NOT NULL,
      `Username` varchar(65) DEFAULT NULL,
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     

  3. 修改dbconf.php中的資料庫設定,才有辦法把登入機制和資料庫做連結。
  4. 修改config.php中的網站設定,才能在網站中加入登入機制。其中$admin_email除非是要由管理員去審核使用者,否則留空即可。下方的信件訊息可自行中文化。$mailServerType的值請清空,以便使用主機的寄信設定。
  5. 註冊頁面:signup.php,密碼至少四個字,且會驗證Email,帳號不得相同,註冊後會寄發啟動信至信箱。點擊驗證後會連至verifyuser.php,並修改資料庫的驗證狀態。
  6. 登入頁面:main_login.php,登出頁面:logout.php。
  7. 登入流程:當輸入正確帳密時checklogin.php會傳回true,並將username及password紀錄到session,然後導回index.php,若輸入錯誤,則會出現錯誤訊息。
  8. 在需要登入的php頁面加入以下語法在最上方,會啟動session並進行驗證導引:
    require "loginheader.php";
  9. 基本上,PHP-Login僅支援BootStrap3,所幸,用到的都是相容的語法,高興的話,可以自行將幾個用到的頁面也改成BootStrap4。
  10. 利用Gmail來寄信的設定:
    • (1)  先Stop Apache,接著點選 General→Mail utility msmtp
    • (2)  按下左上角的 Edit configuration File 按鈕
    • (3)  將Gmail裡面的Email修改成您的Gmail信箱,密碼請設定成該信箱密碼。

四、 讓選單根據有無登入自動切換選項

  1. 利用die(var_dump($_SESSION));可以觀察所有session內容,其內容為陣列。
  2. 要啟用session功能,必須加入 session_start();,可以將之加在頁首檔,越前面越好。
  3. 在Smarty樣板中要可以利用{$smarty.session.索引}來取得某個session的值。
    {if $smarty.session.username}
        <a class="nav-link text-white" href="admin.php">管理</a>
        <a class="nav-link text-white" href="admin.php?op=post_form">發布</a>
        <a class="nav-link text-white" href="logout.php">登出</a>
    {else}
        <a class="nav-link text-white" href="signup.php">註冊</a>
        <a class="nav-link text-white" href="main_login.php">登入</a>
    {/if}

五、 修改資料表

  1. 修改article資料表,加入username 欄位varchar(65),以紀錄文章是由誰發布的。
  2. 修改insert語法,加入username,並用$_SESSION['username']取得發布者名稱。

六、自動抓樣板檔

  1. 若檔名為 index.php 會自動載入 index.tpl 的用法:
    $tpl = str_replace('.php', '.tpl', basename($_SERVER['PHP_SELF']));
    $smarty->display($tpl);
  2. $_SERVER['PHP_SELF']會抓出目前執行檔案的路徑名稱,如:/reporter/index.php

  3. basename() 會抓出路徑的最後一個檔案或目錄名稱,如:basename('/reporter/index.php')會得到index.php

  4. str_replace('搜尋', '取代', '內容') 會在指定內容中做搜尋取代,例如: str_replace('.php', '.tpl', 'index.php')會得到index.tpl

七、樣板檔中根據標籤變數自動載入子樣板

  1. 假如PHP有傳$op給樣板檔,例如:$smarty->assign('op', $op);
  2. $op='show_article' 時,希望引入 show_article.tpl;當 $op='list_article' 時,希望引入 list_article.tpl
    {include file="`$op`.tpl"}

 


:::

搜尋

QR Code 區塊

https%3A%2F%2Fwww.tad0616.net%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D43%26tbdsn%3D1350

書籍目錄

展開 | 闔起

線上使用者

316人線上 (9人在瀏覽線上書籍)

會員: 0

訪客: 316

更多…