4.
加入登入及管理功能
一、 本週要做的事
- 隨機背景(請參考第二週講義第八點)
- 將PHP的設定檔、頁首、頁尾檔獨立出來(請參考第三週講義第十四點)
- 將樣板的頁首、頁尾檔、選單獨立出來(請參考第三週講義第十五點)
二、 讀出單一文章
- 在
switch
流程的default:
中,加入一組有無$sn
的判斷,若有,顯示一篇文章,若無,顯示所有文章。記得在switch
之前針對$sn
外部變數做過濾。
- 內容換行可用
nl2br()
來處理,如:
$article [ 'content' ] = nl2br ( $article [ 'content' ]); |
- 在樣板中,可以針對不同
$op
,載入不同子樣板。

三、 加入登入機制
- 官網:https://github.com/fethica/PHP-Login 中的releases下載PHP-Login-2.0.zip,解壓後將PHP-Login/login下的所有目錄檔案複製到reporter下即可。
- 進入Adminer,點擊「SQL命令」貼語法建立
members
及loginAttempts
兩個資料表
`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 , |
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, |
) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
- 修改dbconf.php中的資料庫設定,才有辦法把登入機制和資料庫做連結。
- 修改config.php中的網站設定,才能在網站中加入登入機制。其中
$admin_email
除非是要由管理員去審核使用者,否則留空即可。下方的信件訊息可自行中文化。$mailServerType的值請清空,以便使用主機的寄信設定。
- 註冊頁面:signup.php,密碼至少四個字,且會驗證Email,帳號不得相同,註冊後會寄發啟動信至信箱。點擊驗證後會連至verifyuser.php,並修改資料庫的驗證狀態。
- 登入頁面:main_login.php,登出頁面:logout.php。
- 登入流程:當輸入正確帳密時checklogin.php會傳回true,並將username及password紀錄到session,然後導回index.php,若輸入錯誤,則會出現錯誤訊息。
- 在需要登入的php頁面加入以下語法在最上方,會啟動session並進行驗證導引:
require "loginheader.php" ; |
- 基本上,PHP-Login僅支援BootStrap3,所幸,用到的都是相容的語法,高興的話,可以自行將幾個用到的頁面也改成BootStrap4。
- 利用Gmail來寄信的設定:
- (1) 先Stop Apache,接著點選 General→Mail utility msmtp
- (2) 按下左上角的 Edit configuration File 按鈕
- (3) 將Gmail裡面的Email修改成您的Gmail信箱,密碼請設定成該信箱密碼。
四、 讓選單根據有無登入自動切換選項
- 利用
die(var_dump($_SESSION));
可以觀察所有session內容,其內容為陣列。
- 要啟用session功能,必須加入
session_start();
,可以將之加在頁首檔,越前面越好。
- 在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 > |
< a class = "nav-link text-white" href = "signup.php" >註冊</ a > |
< a class = "nav-link text-white" href = "main_login.php" >登入</ a > |
五、 修改資料表
- 修改article資料表,加入username 欄位
varchar(65)
,以紀錄文章是由誰發布的。
- 修改insert語法,加入username,並用
$_SESSION['username']
取得發布者名稱。
六、自動抓樣板檔
- 若檔名為 index.php 會自動載入 index.tpl 的用法:
1 | $tpl = str_replace ( '.php' , '.tpl' , basename ( $_SERVER [ 'PHP_SELF' ])); |
-
$_SERVER['PHP_SELF']
會抓出目前執行檔案的路徑名稱,如:/reporter/index.php
-
basename()
會抓出路徑的最後一個檔案或目錄名稱,如:basename('/reporter/index.php')
會得到index.php
-
str_replace('搜尋', '取代', '內容')
會在指定內容中做搜尋取代,例如: str_replace('.php', '.tpl', 'index.php')
會得到index.tpl
七、樣板檔中根據標籤變數自動載入子樣板
- 假如PHP有傳
$op
給樣板檔,例如:$smarty->assign('op', $op);
- 當
$op='show_article'
時,希望引入 show_article.tpl;當 $op='list_article'
時,希望引入 list_article.tpl
{include file="`$op`.tpl"} |