本文是對《PHP and MySQL Web Development》 第5版27章中項目的總結。
1.分析所需功能
列出主要功能模塊:登錄、註冊、忘記密碼、重設密碼、登出、書籤瀏覽、書籤增加、書籤刪除、書籤推薦
確定模塊之間的先後轉移關係:
2.分解所需模塊
將模塊的邏輯和內容分開:
- 內容寫在function_form.php中
- 邏輯寫在function.php中
設置專門文件用於:
- 連接數據庫
- 輸入數據檢驗
- 用戶身份驗證
- 瀏覽器輸出
該項目所有文件可以分爲以下幾類:
1.數據定義文件:bookmarks.sql
用於建立所需數據庫和數據表。
2.數據庫連接文件:db_fns.php
用於連接數據庫。保存着數據庫用戶的用戶名和密碼。
3.輸入數據檢驗文件:user_auth_fns.php
用於檢驗輸入數據。檢驗POST變量的值是否爲空,email輸入是否合法。
4.用戶身份驗證文件:user_auth_fns.php
用於驗證用戶是否能夠註冊、登錄、修改密碼、重設密碼,以及用戶是否已經登錄。
由多個相應功能的函數組成,函數接收參數,連接數據庫進行查詢,返回查詢結果或拋出異常。
5.書籤操作文件:url_fns.php
用於對書籤url進行查詢、增加、刪除與推薦。功能實現方法與上一類相似。
6.瀏覽器輸出文件:output_fns.php
用於顯示所有種類的瀏覽器輸出:
網頁名稱、頁內標題、各種表單、頁內URL、網站信息、用戶菜單、頁尾。
每個函數實現一個種類部位的瀏覽器輸出,函數根據需要可以接收參數,在HTML中插入php顯示,也可以通過php輸出HTML元素。
7.包含常被引用文件集的文件:bookmark_fns.php
8.9.表單文件及對應的邏輯處理文件
表單文件 | login.php | change_passwd_form.php | register_form.php | forgot_form.php | add_bm_form.php |
---|---|---|---|---|---|
邏輯處理文件 | member.php | change_passwd.php | register_new.php | forgot_passwd.php | add_bms.php |
其它邏輯處理文件:
delete_bms.php、recommend.php
logout.php
表單文件的特點:
1.包含對bookmark_fns.php中output_fns.php文件中函數的引用(即一些瀏覽器輸出函數)
2.對於登錄後才能填寫的表單,包含會話開始函數session_start()
和檢驗用戶是否已註冊會話函數check_valid_user()
。
邏輯處理文件的特點: 處理表單提交的數據
1.包含對bookmark_fns.php中output_fns.php文件中函數的引用(即一些瀏覽器輸出函數)
2.包含會話開始函數session_start()
。
3.接收POST變量的信息。
4.對錶單是否填滿、輸入是否合法進行判斷。
5.繼而調用用戶身份驗證函數,如果驗證通過,則顯示相關信息。
6.捕捉所有拋出的異常,合理的顯示在瀏覽器上。
3.主要模塊關鍵思路
1.數據庫連接模塊:
連接數據庫,返回mysqli對象。
function db_connect() {
$db = new mysqli('localhost', 'username', 'password', 'database');
if (!$db) {
throw new Exception("Could not connect to database server");
}else {
return $db;
}
}
2.輸入數據檢驗模塊:
//檢驗每個變量都有一個值
function filled_out($form_vars) {
foreach ($form_vars as $key => $value) {
if ((!isset($key)) || ($value == '')) {
return false;
}
}
return true;
}
//檢驗email
function valid_email($address) {
if(preg_match('/^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/', $address)) {
return true;
} else {
return false;
}
}
3.用戶身份驗證模塊:
先連接數據庫,然後執行查詢語句(最好使用參數化查詢方法),根據查詢結果返回相應的值。
function login($username, $password) {
$conn = db_connect();
$results = $conn -> query("select * from user where username = '".$username."' and passwd = sha1('".$password."')");
if (!$results) {
throw new Exception('Could not log you in.');
}
if ($results -> num_rows > 0) {
return true;
} else {
throw new Exception('Could not log you in.');
}
}
4.登入登出模塊:
//登入成功,設置session
$_SESSION['valid_user'] = $username;
//登出,先保存用戶名,再註銷,通過判斷用戶名是否存在給出不同提示
$old_user = $_SESSION['valid_user'];
unset($_SESSION['valid_user']);
$result_dest = session_destroy();
if (!empty($old_user)) {
if ($result_dest) {
echo 'Logged out.<br />';
}else {
echo 'Could not log you out.<br />';
}
}else {
echo 'You are not logged in ,so have not been logged out.<br />';
}
5.url推薦模塊的sql語句:
如果兩個用戶收藏了相同的URL,那麼可能他們有相似的愛好,就可以把其中一個用戶收藏的其它URL推薦給另一個用戶。
bookmark數據表一共有兩列,bm_URL和username。
$query = "select bm_URL
from bookmark
where username in
(select distinct(b2.username)
from bookmark b1, bookmark b2
where b1.bm_URL = b2.bm_URL
and b1.username != b2.username
and b1.username = '".$valid_user."')
and bm_URL not in
(select bm_URL
from bookmark
where b1.username = '".$valid_user."')
group by bm_URL
having count(bm_URL)>".$popularity;