在開始動手做之前,需要先花點時間想好怎麼樣規劃你的資料庫結構,確定沒問題以後再下去動手實作。
我們接下來要做的作業是:留言板。
可以參考以下需求來想要怎麼設計資料庫結構:
- 身為使用者,在新增留言時應該可以輸入暱稱跟留言內容
- 身為使用者,可以在別人的留言底下新增留言,一樣可以輸入暱稱跟留言內容
- 身為系統,應該每頁只顯示十筆留言,並且可以讓使用者換頁
- 身為系統,應該顯示出留言者的暱稱跟留言內容以及留言時間
- 身為系統,在顯示留言時應該一併列出底下所有的子留言
- 身為系統,顯示留言時應該按照時間排序,最後留的顯示在最上面
請把答案依照格式寫在:hw1.md
請實作出一個簡易的留言版頁面,需要以下元素:
- 有一個留言的區塊可以新增留言
- 能夠顯示留言
可參考以下示意圖(擷取自iT 邦幫忙)
不用做得像上面那麼精緻,只要基本功能有達成就好。例如說留言的區塊只要能輸入純文字就夠了,留言區左邊的那個按讚數也可以不用實作。
可以參考上面附的需求來實作:
- 身為使用者,在新增留言時應該可以輸入暱稱跟留言內容
- 身為使用者,可以在別人的留言底下新增留言,一樣可以輸入暱稱跟留言內容
- 身為系統,應該每頁只顯示十筆留言,並且可以讓使用者換頁
- 身為系統,應該顯示出留言者的暱稱跟留言內容以及留言時間
- 身為系統,在顯示留言時應該一併列出底下所有的子留言
- 身為系統,顯示留言時應該按照時間排序,最後留的顯示在最上面
上面的留言板系統完成之後,要來多加一個功能,那就是會員系統。現在的系統是開放每個訪客可以自己取暱稱,但有了會員系統以後,必須要是會員才能夠留言。
這個時候問題就來了,應該要怎麼實作會員系統呢?
最大的問題是:
每個 Request 之間都是獨立的,在會員登入之後,你要怎麼知道上一個 Request 跟現在的是同一個人呢?
意思就是,你要怎麼知道使用者已經登入了?你要怎麼記錄這個狀態?
在瀏覽器這邊,我們有個東西可以使用,叫做 Cookie,其實它就是可以讓瀏覽器儲存資料的地方。而且呢,Server 端可以主動把資料存到 Cookie 去。
在 PHP 裡面,你可以使用setcookie
函式達成這件事。
// 設定一個 24 小時之後會過期的 Cookie
setcookie("member_id", "001", time()+3600*24);
如此一來,在會員登入之後,我們就能夠利用 setcookie,把會員的資料存到使用者瀏覽器的 cookie 裡面。而瀏覽器在送出 request 的時候,也會把 cookie 的內容一起帶上來,你可以用 $_COOKIE[$cookie_name]
來取得。
if(!isset($_COOKIE["member_id"])) {
echo "not login";
} else {
echo "member id: " . $_COOKIE["member_id"];
}
有了 Cookie 之後,我們就能夠知道使用者是不是登入狀態了。那如果要登出的話呢?也很簡單,只要把 cookie 的內容清掉就好了(換句話說,就是設定一個內容為空的 Cookie),這樣子使用者下次再拜訪頁面時,就會跳出需要登入的提示了。
會員系統的資料庫設計可參考以下的結構:
Table 名稱:users
欄位名稱 | 欄位型態 | 說明 |
---|---|---|
id | integer | 使用者 id |
username | VARCHAR(16) | 帳號 |
password | VARCHAR(16) | 密碼 |
nickname | VARCHAR(64) | 暱稱 |
接著,你需要實作的就是以下幾個頁面:
- 註冊頁面
- 登入頁面
- 登出頁面
以及把原本的留言板改成需要登入才能夠留言,並且自動帶入使用者的暱稱。
- 資料庫欄位型態 VARCHAR 跟 TEXT 的差別是什麼
- Cookie 是什麼?在 HTTP 這一層要怎麼設定 Cookie,瀏覽器又會以什麼形式帶去 Server?
- 我們本週實作的會員系統,你能夠想到什麼潛在的問題嗎?