用户登录程序
本节我们将通过一个用户登录程序把本章所学的知识运用到实际项目中。在用户登录程序中,首先在登录页面用户可通过单击"注册"链接注册一个新账号,或者用已有账号在登录页面输入用户名和密码登录系统;登录成功后回到欢迎页面,否则返回失败页面;登录成功后用户可维护自己的资料,如密码、联系电话等,还可注销当前账号。
1.创建数据库
使用phpMyAdmin创建本项目的数据库,数据库名为sunyang,表名为user,表的结构如图23-26所示。
创建user表的SQL语句如下:
  1. CREATE TABLE `user` (  
  2. `user_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,  
  3. `user_name` VARCHAR( 23 ) NOT NULL ,  
  4. `user_psw` VARCHAR( 23 ) NOT NULL ,  
  5. `user_sex` CHAR( 1 ) NULL ,  
  6. `user_email` VARCHAR( 30 ) NULL ,  
  7. `user_phone` VARCHAR( 15 ) NULL ,  
  8. `user_address` VARCHAR( 30 ) NULL ,  
  9. UNIQUE (  
  10. `user_name`   
  11. )  
  12. ); 
 
图23-26  表user的表结构
2.创建工程的PHP文件
工程所用到的PHP文件及其每个文件的作用如图23-27所示。
 
图23-27  工程的PHP文件
 
3.数据库连接类实现
在数据库连接类里我们使用了PHP的mysqli扩展,以下是数据库连接类的实现代码:
代码23-34  光盘\codes\第23章\23.6\dbconn.class.php
  1. <?php  
  2. class ConnDB{  
  3.     private static $db_host="localhost";                  
  4.     //连接服务器  
  5.     private static $db_user="root";                   
  6.     //连接数据库的用户名  
  7.     private static $db_psw="root";                    
  8.     //连接数据库的密码  
  9.     private static $db_name="sunyang";                
  10.     //数据库名  
  11.     private static $connection;                           
  12.     //数据库连接  
  13.     static function getConn(){  
  14.         $connection=new mysqli(self::$db_host,self::$db_user,self::$db_psw,
    self::
    $db_name);  
  15.         return $connection;                           
  16.         //返回一个数据库连接对象  
  17.     }  
  18. }  
  19. ?> 
4.注册功能实现
注册页面非常简单,就是一个HTML页面,主要让用户填写注册信息,包括用户名、密码、性别、E-mail、联系电话和地址,如图23-28所示。
 
图23-28  用户注册页面
注册页面的关键代码如下:
代码23-35  光盘\codes\第23章\23.6\register.php
  1. 代码23-35  光盘\codes\第23章\23.6\register.php  
  2.  
  3. <form name="registerFrom" action="userController.  
  4. php?flag=register" method="POST" >  
  5. <table>       
  6. <tr>  
  7. <td>用户名*</td><td><input type="text" name="user_name"   
  8. id="user_name"></td>  
  9. </tr>      
  10. <tr>  
  11. <td>密码*</td>  
  12.        <td><input type="password" name="user_password"   
  13.        id="user_password"></td>  
  14.      </tr>  
  15.      <tr>  
  16.        <td>验证密码*</td>  
  17.        <td><input type="password" name="validate_password" id="validate_password"></td>  
  18.       </tr>  
  19.       <tr>  
  20.        <td>性别</td><td><input type="text" name="  
  21.        user_sex" id="user_sex"></td>  
  22.       </tr  
  23.        <td>email</td>  
  24.        <td>  
  25. <input type="radio" name="user_sex" id="user_sex"   
  26. value="男" >男  
  27.            <input type="radio" name="user_sex"   
  28.            id="user_sex" value="女" >女  
  29. </td>  
  30.       </tr>  
  31.       <tr>  
  32.        <td>联系电话</td><td><input type="text"   
  33.        name="user_phone" id="user_phone"></td>  
  34.       </tr>  
  35.       <tr>  
  36.        <td>地址</td><td><input type="text"   
  37.        name="user_address" id="user_address"></td>  
  38. </tr>  
  39. <tr>  
  40.      <tr>  
  41.        <td><input id="submit" name="submit" type="  
  42.        submit" value="提交"></td>  
  43. <td><input name="return" type="button" onClick="  
  44. javascript:history.back()"  
  45.  value="返回"></td>  
  46.      </tr>    
  47. </table>  
  48. </form> 
 
单击"提交"按钮后,form表单会根据action中的路径将数据提交到userController.php,下面是userController.php中用户注册功能的代码:
代码23-36  光盘\codes\第23章\23.6\userController.php1
  1. <?php  
  2. include("userModel.class.php");  
  3. if(isset($_REQUEST['flag'])){  
  4. $flag=$_REQUEST['flag'];  
  5. }  
  6. switch ($flag){                                   
  7. //根据参数进行不同的功能控制  
  8.     case "register":  
  9.         register();  
  10.         break;  
  11.         ......                                
  12.         //省略其他代码  
  13. }  
  14. function register(){                                  
  15. //用户注册  
  16.     $registerArray=array(  
  17.         'user_name'=>$_POST['user_name'],  
  18.         'user_password'=>$_POST['user_password'],  
  19.         'user_sex'=>$_POST['user_sex'],  
  20.         'user_email'=>$_POST['user_email'],  
  21.         'user_phone'=>$_POST['user_phone'],  
  22.         'user_address'=>$_POST['user_address'],  
  23.     );  
  24.     $userModel=new UserModel();  
  25.     if ($userModel->checkRegister($registerArray 
  26.     ['user_name'])){      
  27.     //判断用户名是否存在  
  28.         $userModel->register($registerArray);  
  29.         header("Location:login.php");  
  30.     }else {  
  31.         echo "注册的用户名已经存在";  
  32.     }  
  33. }  
  34. ......                                        
  35. //省略其他代码  
  36. ?> 
在上面代码中首先判断注册的用户名是否存在,若不存在,用户可注册,否则提示用户"注册的用户名已经存在"。下面是判断注册名称是否存在和保存注册信息的代码。
代码23-37  光盘\codes\第23章\23.6\userModel.php
  1. <?php  
  2. include("dbconn.class.php");  
  3. class UserModel{  
  4.     function checkRegister($username){                    
  5.     //查询注册的用户名是否存在  
  6.         $mysqli=DBConn::getConn();  
  7.         $sql="select user_name from user where user_name=? ";  
  8.         $result=$mysqli->prepare($sql);  
  9.         $result->bind_param("s",$user_name);                  
  10.         //绑定参数  
  11.         $user_name=$username;  
  12.         $result->execute();  
  13.         $result->bind_result($user_name);                 
  14.         //绑定结果  
  15.         if ($result->fetch()) {  
  16.             $result->close();  
  17.             $mysqli->close();  
  18.             return FALSE;  
  19.         }else {  
  20.             $result->close();  
  21.             $mysqli->close();  
  22.             return TRUE;  
  23.         }  
  24.     }  
  25.     function register($registerArray){                    
  26.     //存储用户注册  
  27.         $mysqli=DBConn::getConn();  
  28.         $mysqli->query("set names gb2312");               
  29.         //转换字符编码格式  
  30.         $query="insert into user (user_name,user_psw,user_sex,user_
    email,user_phone,user_  
  31.         address)  
  32.              values(?,?,?,?,?,?)";  
  33.         $result=$mysqli->prepare($query);  
  34.     $result->bind_param("ssssss",$user_name,  
  35.     $user_psw,$user_sex,  
  36.     $user_email,$user_phone,$user_address);   
  37.                                             //参数绑定  
  38.         $user_name=$registerArray['user_name'];  
  39.         $user_psw=$registerArray['user_password'];  
  40.         $user_sex=$registerArray['user_sex'];  
  41.         $user_email=$registerArray['user_email'];  
  42.         $user_phone=$registerArray['user_phone'];  
  43.         $user_address=$registerArray['user_address'];  
  44.         $result->execute();  
  45.         $mysqli->close();  
  46.     }  
  47. }  
  48. ......                                          //省略其他代码  
  49. ?> 
 
5.登录功能实现
用户注册成功以后将跳转到登录页面,在登录页面中输入已注册的用户名和密码方可登录,如图23-29所示。
 
图23-29 用户登录页面
下面是登录页面的关键代码:
代码23-38  光盘\codes\第23章\23.6\login.php
  1. <form name="loginFrom" action="userController.php?  
  2. flag=login" method="POST" >  
  3.     <table>  
  4.     <tr><td>用户名</td>  
  5.     <td> <input type="text" name="user_name"   
  6.     id="user_name"></td></tr>  
  7.     <tr><td>密码</td>  
  8.     <td><input type="password" name="user_password" id=
    "user_password"></td></tr>  
  9.     <tr><td><input id="submit" name="submit" type="  
  10.     submit" value="登录"></td>  
  11.     <td> <a href="register.php">新用户注册</a></td></tr>  
  12.     </table>  
  13.     </form> 
在登录页面中输入用户名和密码后,数据将会提交到userController.php做判断,如果用户名和密码正确进入成功页面,否则返回失败页面。控制用户登录页面跳转的代码如下:
代码23-39  光盘\codes\第23章\23.6\userController.php
  1. <?php  
  2. include("userModel.class.php");  
  3. if(isset($_REQUEST['flag'])){  
  4.     $flag=$_REQUEST['flag'];  
  5. }  
  6. switch ($flag){  
  7.     case "login":     
  8.         login();  
  9.         break;    
  10.         ......                            
  11.         //省略其他代码  
  12. }  
  13. function login(){                             
  14. //用户登录  
  15.     $user_name=$_POST['user_name'];  
  16.     $user_password=$_POST['user_password'];  
  17.     $userModel=new UserModel();  
  18.     $userList=$userModel->checkLogin  
  19.     ($user_name,$user_password);  
  20.     if (isset($userList)){                        
  21.     //判断登录的用户名和密码是否正确  
  22.         header("Location:success.php");   
  23.     }else {  
  24.         header("Location:error.php");  
  25.     }         
  26. }  
  27. ......                                    
  28. //省略其他代码  
  29. ?> 
 
登录的用户名和密码是否存在于数据库中是通过UserModel类的checkLogin()方法来验证的,checkLogin()方法的代码如下:
代码23-40  光盘\codes\第23章\23.6\userController.php
  1. <?php  
  2. include("dbconn.class.php");  
  3. class UserModel{  
  4. function checkLogin($username,$userpsw){              
  5. //验证用户名和密码  
  6. $mysqli=DBConn::getConn();  
  7. $sql="select * from user where user_name=?   
  8. and user_psw=?";  
  9. $result=$mysqli->prepare($sql);  
  10. $result->bind_param("ss",$user_name,$user_psw);   
  11. //绑定参数  
  12. $user_name=$username;  
  13. $user_psw=$userpsw;  
  14. $result->execute();  
  15. $result->bind_result($user_id,$user_name,$user_psw,  
  16. $user_sex,$user_email,  
  17.             $user_phone,$user_address);   
  18.             //绑定结果  
  19. while ($result->fetch()) {  
  20.     $userList=array(                      
  21.     //将结果集放入数组中  
  22.  
  23. 'user_id'=>$user_id,'user_name'=>$user_name,  
  24. 'user_psw'=>$user_psw,'user_sex'=>$user_sex,  
  25. 'user_email'=>$user_email,'user_phone'=>$user_phone,  
  26. 'user_address'=>$user_address 
  27.     );  
  28. }  
  29. $result->close();  
  30. $mysqli->close();  
  31. return $userList;                         
  32. //返回一个数组  
  33. }  
  34. }  
  35. ......                                        
  36. //省略其他代码  
  37. ?> 
6.用户资料维护功能实现
登录成功以后可显示所有注册用户的资料信息,并可对其进行编辑,包括修改和删除用户资料,如图23-30所示。
 
图23-30  显示用户资料页面
显示所有用户资料的代码如下:
代码23-41  光盘\codes\第23章\23.6\userModel.php
  1. function selectAllUser(){                             
  2. //查询所有用户  
  3. $mysqli=DBConn::getConn();  
  4. $mysqli->query("set names gb2312");                   
  5. //转换字符编码格式  
  6. $sql="select * from user ";  
  7. $result=$mysqli->prepare($sql);  
  8. $result->execute();  
  9. $result->bind_result($user_id,$user_name,$user_psw,  
  10. $user_sex,$user_email,$user_phone,$user_address);  
  11. //绑定结果  
  12. $userArray=array();  
  13. while ($result->fetch()) {  
  14. $userList=array(  
  15. 'user_id'=>$user_id,'user_name'=>$user_name,  
  16. 'user_psw'=>$user_psw,'user_sex'=>$user_sex,  
  17. 'user_email'=>$user_email,'user_phone'=>$user_phone,  
  18. 'user_address'=>$user_address 
  19. );  
  20. $userArray[]=$userList;                   
  21. //将保存不同用户信息的数组分别放入另一个数组中  
  22. }     
  23. $result->close();  
  24. $mysqli->close();  
  25. return $userArray;                            
  26. //返回一个数组 
 
在成功页面中,单击"修改"链接可修改用户资料,修改用户资料的页面如图23-31所示。
 
图23-31  修改用户资料页面
在修改页面中,可将用户资料重新编辑,单击"修改"按钮即可,下面是修改用户信息中的控制页面跳转的代码:
代码23-42  光盘\codes\第23章\23.6\userController.php
  1. //修改用户信息  
  2. function update(){  
  3. $updateArray=array(  
  4. '   user_password'=>$_POST['user_password'],'  
  5. user_sex'=>$_POST['user_sex'],  
  6.     'user_email'=>$_POST['user_email'],'  
  7.     user_phone'=>$_POST['user_phone'],  
  8.     'user_address'=>$_POST['user_address'],'  
  9.     user_id'=>$_POST['id']  
  10. );  
  11. $userModel=new UserModel();  
  12. $userModel->update($updateArray);                 
  13. //修改用户信息  
  14. $user=$userModel->selectAllUser();                    
  15. //所有用户信息  
  16. include("success.php");  
  17. exit();  
修改用户信息中的数据库操作的代码:
代码23-43光盘\codes\第23章\23.6\userModel.php
  1. function update($updateArray){                    
  2. //修改用户信息  
  3. $mysqli=DBConn::getConn();  
  4. $mysqli->query("set names gb2312");           
  5. //设置字符编码格式  
  6. $query="update user set user_psw=?,user_sex=?,  
  7. user_email=?,user_phone=?,user_address=? where user_id=?";                                          
    //更新用户信息  
  8. $result=$mysqli->prepare($query);  
  9. $result->bind_param("sssssi",$user_psw,  
  10. $user_sex,$user_email,  
  11. $user_phone,$user_address,$user_id);              
  12. //参数绑定  
  13. $user_psw=$updateArray['user_password'];  
  14. $user_sex=$updateArray['user_sex'];  
  15. $user_email=$updateArray['user_email'];  
  16. $user_phone=$updateArray['user_phone'];  
  17. $user_address=$updateArray['user_address'];  
  18. $user_id=$updateArray['user_id'];  
  19. $result->execute();  
  20. $mysqli->close();  
在成功页面中单击"删除"链接可删除一个用户资料,下面是删除用户资料的代码:
代码23-44  光盘\codes\第23章\23.6\userModel.php
  1. function delete($id){                         
  2. //删除用户信息  
  3.     $mysqli=DBConn::getConn();  
  4.     $mysqli->query("set names gb2312");           
  5.     //设置字符编码格式  
  6.     $query="delete from user where user_id=?";  
  7.     $result=$mysqli->prepare($query);  
  8.     $result->bind_param("i",$user_id);            
  9.     //参数绑定  
  10.     $user_id=$id;  
  11.     $result->execute();  
  12.     $mysqli->close();  
 
小结
本章主要介绍了PHP的两个扩展:一个是mysql扩展,另一个是mysqli扩展。在mysql扩展中讲解了PHP如何操作MySQL服务器,包括如何连接与断开MySQL服务器、如何操作查询语句及如何获得服务器信息;在mysqli扩展中讲解了mysqli扩展所具有的优势、使用mysqli存取数据、使用预准备语句及使用多个查询;最后通过项目实战,把理论知识应用到实际开发中,相信读者能将本章掌握得更好。