續(xù)前節(jié)《ThinkPHP初學(xué)者:寫一個(gè)簡單登錄頁面》,我們已經(jīng)實(shí)現(xiàn)了使用PHP登錄的方式兼耀。然而在實(shí)際項(xiàng)目中,用戶名和密碼一向都不是直接操作數(shù)據(jù)庫完成的舶沿,而是由用戶自己注冊完成堡距,所以注冊頁面不可或缺型型。
進(jìn)入注冊頁面鹏漆,一般都是在登錄頁有一個(gè)按鈕入口躁愿,點(diǎn)擊后跳轉(zhuǎn)完成嫁盲。如果跳轉(zhuǎn)使用<a>標(biāo)簽實(shí)現(xiàn)篓叶,可以直接使用相對路徑,或者如果是前后端分離羞秤,這個(gè)跳轉(zhuǎn)也可以由js完成缸托。由于目前使用的是混合在一起開發(fā)的,所以跳轉(zhuǎn)的方式略微不同瘾蛋,我們在window.location.href=""
中所填寫的相對路徑嗦董,指向的是控制器下的方法,也就是{:U('控制器名/方法名')}
瘦黑,本文中使用的就是{:U('Index/regist')}
京革。
接下來需要實(shí)現(xiàn)的是注冊的邏輯。在Index控制器下幸斥,新建regist方法匹摇。在regist方法體內(nèi),需要校驗(yàn)用戶名是否已存在甲葬,然后再向數(shù)據(jù)庫中插入數(shù)據(jù)廊勃。如果想要更好的用戶體驗(yàn),可以在用戶輸入完用戶名后就校驗(yàn)经窖,避免用戶需要回來修改的麻煩坡垫,實(shí)現(xiàn)這一方案可以使用Ajax。所以為了更好的體驗(yàn)画侣,這里使用第二種方案冰悠,因此還需要新建一個(gè)checkValid的方法。相關(guān)代碼如下:
public function regist() {
if (!$_POST) {
$this->display();
} else {
header('Content-Type:application/json; charset=utf-8');
//數(shù)據(jù)校驗(yàn)配乱,包括正則校驗(yàn)
...省略代碼
$User = D("User");
$result = $User->exists($user_name);
if (!empty($result)) {
$return['code'] = 0;
$return['message'] = '用戶名已存在';
exit(json_encode($return));
}
if ($result['user_pass'] != $user_pass) {
$return['code'] = 0;
$return['message'] = '密碼錯(cuò)誤';
exit(json_encode($return));
}
$res = $User->regist($user_name, $user_pass, $phone, $email, $sex);
if (!$res) {
$return['code'] = 0;
$return['message'] = '注冊失敗溉卓,請稍后再試';
exit(json_encode($return));
}
$return['code'] = 1;
$return['message'] = '注冊成功';
echo json_encode($return);
}
}
public function checkValid() {
header('Content-Type:application/json; charset=utf-8');
//數(shù)據(jù)校驗(yàn)
...省略代碼
$result = D("User")->exists($user_name);
if (!empty($result)) {
$return['code'] = 0;
$return['message'] = '用戶名已存在';
exit(json_encode($return));
}
$return['code'] = 1;
$return['message'] = '用戶名可以使用';
echo json_encode($return);
}
可以看到,在regist方法中搬泥,存在如下結(jié)構(gòu):
if (!$_POST) {
$this->display();
} else {
...
}
這是因?yàn)樯U趶牡卿涰撁纥c(diǎn)擊按鈕跳轉(zhuǎn)過來時(shí),調(diào)用的也是這個(gè)方法忿檩,而跳轉(zhuǎn)時(shí)是沒有傳遞任何數(shù)據(jù)的尉尾,只有傳遞數(shù)據(jù)時(shí)才會走else里的代碼。
regist方法中燥透,還調(diào)用了UserModel中定義的regist()方法沙咏,在這個(gè)方法里把用戶的數(shù)據(jù)插入到了數(shù)據(jù)庫中辨图。在TP中,向數(shù)據(jù)庫中插入數(shù)據(jù)使用add()方法芭碍,插入成功會返回插入數(shù)據(jù)的id,失敗則會返回false孽尽,代碼如下:
public function regist($user_name, $user_pass, $user_phone, $user_email, $user_sex) {
$data["user_name"] = $user_name;
$data["user_pass"] = $user_pass;
$data["user_phone"] = $user_phone;
$data["user_email"] = $user_email;
$data["user_sex"] = $user_sex;
$data["create_time"] = time();
return $this->add($data);
}
add()方法還可以設(shè)置過濾等操作以保證安全性窖壕,可以參考官方文檔。
regist方法在點(diǎn)擊注冊按鈕時(shí)觸發(fā)杉女,這和登錄時(shí)類似瞻讽,而checkValid方法可以在用戶名輸入框失去焦點(diǎn)時(shí)自動運(yùn)行,或者設(shè)計(jì)一個(gè)按鈕點(diǎn)擊運(yùn)行熏挎,這個(gè)因人而異了速勇。在jQuery中,可以使用blur()
方法監(jiān)聽失去焦點(diǎn)事件坎拐。相關(guān)的代碼都和登錄時(shí)類似烦磁,就不粘貼了,有需要可以看文末鏈接哼勇。
注冊完成后都伪,一種方式是跳轉(zhuǎn)回登錄頁面,用戶需要輸入用戶名密碼等進(jìn)行登錄积担,還有一種現(xiàn)在廣泛使用的方式是注冊完成后直接進(jìn)入主頁陨晶,也就是注冊完就相當(dāng)于登錄成功了。無論是哪種方式帝璧,最終都會進(jìn)入主頁先誉,這時(shí)就需要使用Session來保持登錄狀態(tài)了。相關(guān)內(nèi)容在實(shí)現(xiàn)主頁時(shí)再詳細(xì)介紹吧的烁。
當(dāng)然褐耳,實(shí)際使用的注冊,不會是這么簡單的邏輯渴庆,比如要使用加密保證密碼安全漱病,密碼等信息是不能明文傳輸?shù)模@些就需要根據(jù)自己選擇的算法進(jìn)行處理了把曼。
本項(xiàng)目源碼已同步到github上杨帽,如需查看,同步下來后嗤军,配置一下數(shù)據(jù)庫即可注盈。
奉上github地址:https://github.com/LtLei/PHPLearn。