|
前言 網(wǎng)站用戶注冊與登錄是很常用的一個功能,本節(jié)教材就以此來演示一下 PHP 中如何開發(fā)用戶注冊與登錄模塊。 本節(jié)需要用到的重點 PHP 基礎(chǔ)知識: l PHP 中預(yù)定義 $_POST 和 $_GET 全局變量來接受用戶表單和 URL 參數(shù)信息,關(guān)于 PHP 表單更多信息參見《PHP 表單》。 l PHP 正則表達(dá)式用于判斷用戶的輸入是否符合要求,關(guān)于正則表達(dá)式更多信息參見《PHP 正則表達(dá)式》。 l 用戶登錄檢測通過后以 session 來保持用戶的登錄信息,關(guān)于 session 更多信息參見《PHP Session》或者《PHP Cookie》。 需求分析 主要功能分為用戶注冊、用戶登錄、用戶退出、用戶中心四個部分。 用戶注冊 用戶注冊主要功能有: 1. 注冊信息表單填寫界面javascript腳本初步檢測用戶輸入的注冊信息。 2. 注冊處理模塊檢測注冊信息是否符合要求。 3. 檢測用戶名是否已存在。 4. 將注冊信息寫入數(shù)據(jù)表,注冊成功。 用戶登錄 用戶登錄主要功能有: 1. 登錄表單界面javascript腳本初步檢測用戶輸入的登錄信息。 2. 登錄模塊將用戶輸入信息與數(shù)據(jù)庫數(shù)據(jù)進(jìn)行核對。 3. 登錄信息正確,則提示登錄成功,將用戶設(shè)置為登錄狀態(tài)(session)。 4. 登錄信息不正確,則提示登錄失敗,用戶可以再次嘗試登錄。 用戶退出 用戶退出主要功能有: 1. 無條件注銷 session 。 用戶中心 用戶退出主要功能有: 1. 判斷用戶是否登錄,如果沒有登錄,則轉(zhuǎn)向到登錄界面。 2. 如果登錄是登錄狀態(tài),則讀出用戶相關(guān)信息。 數(shù)據(jù)表設(shè)計 根據(jù)功能需求分析,用于記用戶信息的 user 表需要的字段如下: 字段名 | 數(shù)據(jù)類型 | 說明 | uid | mediumint(8) | 主鍵,自動增長 | username | char(15) | 注冊用戶名 | password | char(32) | MD5 加密后的密碼 | email | varchar(40) | 用戶 Email | regdate | int(10) | 用戶注冊時間戳 |
|
|
|
建表 SQL 參考如下: CREATE TABLE `user` ( `uid` mediumint(8) unsigned NOT NULL auto_increment, `username` char(15) NOT NULL default '', `password` char(32) NOT NULL default '', `email` varchar(40) NOT NULL default '', `regdate` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`uid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 頁面布局 各頁面功能如下: l reg.html:用戶注冊信息填寫表單頁面 l conn.php:數(shù)據(jù)庫連接包含文件 l reg.php:用戶注冊處理程序 l login.html:用戶登錄表單頁面 l login.php:用戶登錄表單頁面 l my.php:用戶中心 注冊頁面reg.html 負(fù)責(zé)收集用戶填寫的注冊信息。教程里只列出關(guān)鍵的代碼片段,完整的代碼附在本節(jié)最后。 注冊表單<fieldset> <legend>用戶注冊</legend> <form name="RegForm" method="post" action="reg.php" onSubmit="return InputCheck(this)"> <p> <label for="username" >用戶名:</label> <input id="username" name="username" type="text" /> <span>(必填,3-15字符長度,支持漢字、字母、數(shù)字及_)</span> <p/> <p> <label for="password" >密碼:</label> <input id="password" name="password" type="password" /> <span>(必填,不得少于6位)</span> <p/> <p> <label for="repass" >重復(fù)密碼:</label> <input id="repass" name="repass" type="password" /> <p/> <p> <label for="email" >電子郵箱:</label> <input id="email" name="email" type="text" /> <span>(必填)</span> <p/> <p> <input type="submit" name="submit" value=" 提交注冊 " /> </p> </form> </fieldset> javascript檢測代碼<script language=JavaScript> <!-- functionInputCheck(RegForm) { if (RegForm.username.value == "") { alert("用戶名不可為空!"); RegForm.username.focus(); return (false); } if (RegForm.password.value == "") { alert("必須設(shè)定登錄密碼!"); RegForm.password.focus(); return (false); } if (RegForm.repass.value != RegForm.password.value) { alert("兩次密碼不一致!"); RegForm.repass.focus(); return (false); } if (RegForm.email.value == "") { alert("電子郵箱不可為空!"); RegForm.email.focus(); return (false); } } //--> </script> CSS 樣式<style type="text/css"> html{font-size:12px;} fieldset{width:520px; margin: 0 auto;} legend{font-weight:bold; font-size:14px;} label{float:left; width:70px; margin-left:10px;} .left{margin-left:80px;} .input{width:150px;} span{color: #666666;} </style> 注冊表單效果圖: 
數(shù)據(jù)庫連接<?php $conn = @mysql_connect("localhost","root","root123"); if (!$conn){ die("連接數(shù)據(jù)庫失?。?quot; . mysql_error()); } mysql_select_db("test", $conn); //字符轉(zhuǎn)換,讀庫 mysql_query("set character set 'gbk'"); //寫庫 mysql_query("set names 'gbk'"); ?> 注冊處理reg.php負(fù)責(zé)處理用戶注冊信息。 注冊檢測if(!isset($_POST['submit'])){ exit('非法訪問!'); } $username = $_POST['username']; $password = $_POST['password']; $email = $_POST['email']; //注冊信息判斷 if(!preg_match('/^[wx80-xff]{3,15}$/', $username)){ exit('錯誤:用戶名不符合規(guī)定。<a href="javascript:history.back(-1);">返回</a>'); } if(strlen($password) < 6){ exit('錯誤:密碼長度不符合規(guī)定。<a href="javascript:history.back(-1);">返回</a>'); } if(!preg_match('/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/', $email)){ exit('錯誤:電子郵箱格式錯誤。<a href="javascript:history.back(-1);">返回</a>'); } 本段代碼首先檢測是否 POST 提交訪問該頁,接下來根據(jù)注冊要求(用戶名 3-15 字符長度,支持漢字、字母、數(shù)字及_;密碼不得少于 6 位)對用戶提交的注冊信息進(jìn)行檢測。在檢測用戶名和電子郵箱時采用了正則檢測,關(guān)于正則表達(dá)式更所信息請參看《PHP 正則表達(dá)式》。 數(shù)據(jù)庫交互//包含數(shù)據(jù)庫連接文件 include('conn.php'); //檢測用戶名是否已經(jīng)存在 $check_query = mysql_query("select uid from user where username='$username' limit 1"); if(mysql_fetch_array($check_query)){ echo '錯誤:用戶名 ',$username,' 已存在。<a href="javascript:history.back(-1);">返回</a>'; exit; } //寫入數(shù)據(jù) $password = MD5($password); $regdate = time(); $sql = "INSERT INTO user(username,password,email,regdate)VALUES('$username','$password','$email', $regdate)"; if(mysql_query($sql,$conn)){ exit('用戶注冊成功!點擊此處<a href="login.html">登錄</a>'); } else { echo '抱歉!添加數(shù)據(jù)失?。?#39;,mysql_error(),'<br />'; echo '點擊此處<a href="javascript:history.back(-1);">返回</a>重試'; } 登錄頁面login.html 負(fù)責(zé)收集用戶填寫的登錄信息。 <fieldset> <legend>用戶登錄</legend> <form name="LoginForm" method="post" action="login.php" onSubmit="return InputCheck(this)"> <p> <label for="username" >用戶名:</label> <input id="username" name="username" type="text" /> <p/> <p> <label for="password" >密碼:</label> <input id="password" name="password" type="password" /> <p/> <p> <input type="submit" name="submit" value=" 確定 " /> </p> </form> </fieldset> javascript檢測及 CSS 樣式可參考 reg.html,本部分略去,可直接查看最后附錄的完整代碼。 登錄處理login.php負(fù)責(zé)處理用戶登錄與退出動作。 //登錄 if(!isset($_POST['submit'])){ exit('非法訪問!'); } $username = htmlspecialchars($_POST['username']); $password = MD5($_POST['password']); //包含數(shù)據(jù)庫連接文件 include('conn.php'); //檢測用戶名及密碼是否正確 $check_query = mysql_query("select uid from user where username='$username' and password='$password' limit 1"); if($result = mysql_fetch_array($check_query)){ //登錄成功 $_SESSION['username'] = $username; $_SESSION['userid'] = $result['uid']; echo $username,' 歡迎你!進(jìn)入<a href="my.php">用戶中心</a><br />'; echo '點擊此處<a href="login.php?action=logout">注銷</a>登錄!<br />'; exit; } else { exit('登錄失敗!點擊此處<a href="javascript:history.back(-1);">返回</a>重試'); } 該段代碼首先確認(rèn)如果是用戶登錄的話,必須是 POST 動作提交。然后根據(jù)用戶輸入的信息去數(shù)據(jù)庫核對是否正確,如果正確,注冊 session 信息,否則提示登錄失敗,用戶可以重試。 該段代碼需要在頁面開頭啟用session_start() 函數(shù),參見下面退出處理代碼部分。 退出處理處理用戶退出的代碼跟處理登錄的代碼都在login.php里。 session_start(); //注銷登錄 if($_GET['action'] == "logout"){ unset($_SESSION['userid']); unset($_SESSION['username']); echo '注銷登錄成功!點擊此處<a href="login.html">登錄</a>'; exit; } 該段代碼在處理用戶登錄的代碼之前,只允許以login.php?action=logout 的方式訪問,其他方式都認(rèn)為是檢測用戶登錄。具體邏輯參看附錄完整代碼。 用戶中心my.php是用戶中心,列在教程里作為用戶登錄檢測參考。 <?php session_start(); //檢測是否登錄,若沒登錄則轉(zhuǎn)向登錄界面 if(!isset($_SESSION['userid'])){ header("Location:login.html"); exit(); } //包含數(shù)據(jù)庫連接文件 include('conn.php'); $userid = $_SESSION['userid']; $username = $_SESSION['username']; $user_query = mysql_query("select * from user where uid=$userid limit 1"); $row = mysql_fetch_array($user_query); echo '用戶信息:<br />'; echo '用戶ID:',$userid,'<br />'; echo '用戶名:',$username,'<br />'; echo '郵箱:',$row<'email'>,'<br />'; echo '注冊日期:',date("Y-m-d", $row['regdate']),'<br />'; echo '<a href="login.php?action=logout">注銷</a>登錄<br />'; ?> PHP 附錄 :用戶注冊與登錄完整代碼 以下列出了用戶注冊與登錄的完整代碼,您也可以點擊此處下載本節(jié)教程完整的源代碼壓縮包。 login.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> <html xmlns=""> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <title>用戶登錄</title> <style type="text/css"> html{font-size:12px;} fieldset{width:520px; margin: 0 auto;} legend{font-weight:bold; font-size:14px;} label{float:left; width:70px; margin-left:10px;} .left{margin-left:80px;} .input{width:150px;} span{color: #666666;} </style> <script language=JavaScript> <!-- functionInputCheck(LoginForm) { if (LoginForm.username.value == "") { alert("請輸入用戶名!"); LoginForm.username.focus(); return (false); } if (LoginForm.password.value == "") { alert("請輸入密碼!"); LoginForm.password.focus(); return (false); } } //--> </script> </head> <body> <div> <fieldset> <legend>用戶登錄</legend> <form name="LoginForm" method="post" action="login.php" onSubmit="return InputCheck(this)"> <p> <label for="username" >用戶名:</label> <input id="username" name="username" type="text" /> <p/> <p> <label for="password" >密碼:</label> <input id="password" name="password" type="password" /> <p/> <p> <input type="submit" name="submit" value=" 確定 " /> </p> </form> </fieldset> </div> </body> </html> conn.php<?php /***************************** *數(shù)據(jù)庫連接 *****************************/ $conn = @mysql_connect("localhost","root","root123"); if (!$conn){ die("連接數(shù)據(jù)庫失?。?quot; . mysql_error()); } mysql_select_db("test", $conn); //字符轉(zhuǎn)換,讀庫 mysql_query("set character set 'gbk'"); //寫庫 mysql_query("set names 'gbk'"); ?> reg.php<?php if(!isset($_POST['submit'])){ exit('非法訪問!'); } $username = $_POST['username']; $password = $_POST['password']; $email = $_POST['email']; //注冊信息判斷 if(!preg_match('/^[wx80-xff]{3,15}$/', $username)){ exit('錯誤:用戶名不符合規(guī)定。<a href="javascript:history.back(-1);">返回</a>'); } if(strlen($password) < 6){ exit('錯誤:密碼長度不符合規(guī)定。<a href="javascript:history.back(-1);">返回</a>'); } if(!preg_match('/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/', $email)){ exit('錯誤:電子郵箱格式錯誤。<a href="javascript:history.back(-1);">返回</a>'); } //包含數(shù)據(jù)庫連接文件 include('conn.php'); //檢測用戶名是否已經(jīng)存在 $check_query = mysql_query("select uid from user where username='$username' limit 1"); if(mysql_fetch_array($check_query)){ echo '錯誤:用戶名 ',$username,' 已存在。<a href="javascript:history.back(-1);">返回</a>'; exit; } //寫入數(shù)據(jù) $password = MD5($password); $regdate = time(); $sql = "INSERT INTO user(username,password,email,regdate)VALUES('$username','$password','$email', $regdate)"; if(mysql_query($sql,$conn)){ exit('用戶注冊成功!點擊此處<a href="login.html">登錄</a>'); } else { echo '抱歉!添加數(shù)據(jù)失?。?#39;,mysql_error(),'<br />'; echo '點擊此處<a href="javascript:history.back(-1);">返回</a>重試'; } ?> login.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> <html xmlns=""> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <title>用戶登錄</title> <style type="text/css"> html{font-size:12px;} fieldset{width:300px; margin: 0 auto;} legend{font-weight:bold; font-size:14px;} .label{float:left; width:70px; margin-left:10px;} .left{margin-left:80px;} .input{width:150px;} span{color: #666666;} </style> <script language=JavaScript> <!-- functionInputCheck(LoginForm) { if (LoginForm.username.value == "") { alert("請輸入用戶名!"); LoginForm.username.focus(); return (false); } if (LoginForm.password.value == "") { alert("請輸入密碼!"); LoginForm.password.focus(); return (false); } } //--> </script> </head> <body> <div> <fieldset> <legend>用戶登錄</legend> <form name="LoginForm" method="post" action="login.php" onSubmit="return InputCheck(this)"> <p> <label for="username" >用戶名:</label> <input id="username" name="username" type="text" /> <p/> <p> <label for="password" >密碼:</label> <input id="password" name="password" type="password" /> <p/> <p> <input type="submit" name="submit" value=" 確定 " /> </p> </form> </fieldset> </div> </body> </html> login.php<?php session_start(); //注銷登錄 if($_GET['action'] == "logout"){ unset($_SESSION['userid']); unset($_SESSION['username']); echo '注銷登錄成功!點擊此處<a href="login.html">登錄</a>'; exit; } //登錄 if(!isset($_POST['submit'])){ exit('非法訪問!'); } $username = htmlspecialchars($_POST['username']); $password = MD5($_POST['password']); //包含數(shù)據(jù)庫連接文件 include('conn.php'); //檢測用戶名及密碼是否正確 $check_query = mysql_query("select uid from user where username='$username' and password='$password' limit 1"); if($result = mysql_fetch_array($check_query)){ //登錄成功 $_SESSION['username'] = $username; $_SESSION['userid'] = $result['uid']; echo $username,' 歡迎你!進(jìn)入<a href="my.php">用戶中心</a><br />'; echo '點擊此處<a href="login.php?action=logout">注銷</a>登錄!<br />'; exit; } else { exit('登錄失?。↑c擊此處<a href="javascript:history.back(-1);">返回</a>重試'); } ?> my.php<?php session_start(); //檢測是否登錄,若沒登錄則轉(zhuǎn)向登錄界面 if(!isset($_SESSION['userid'])){ header("Location:login.html"); exit(); } //包含數(shù)據(jù)庫連接文件 include('conn.php'); $userid = $_SESSION['userid']; $username = $_SESSION['username']; $user_query = mysql_query("select * from user where uid=$userid limit 1"); $row = mysql_fetch_array($user_query); echo '用戶信息:<br />'; echo '用戶ID:',$userid,'<br />'; echo '用戶名:',$username,'<br />'; echo '郵箱:',$row['email'],'<br />'; echo '注冊日期:',date("Y-m-d", $row['regdate']),'<br />'; echo '<a href="login.php?action=logout">注銷</a>登錄<br />'; ?>
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|