网站用户注册与登录是很常用的一个功能,本节教材就以此来演示一下 PHP 中如何开发用户注册与登录模块。
本节需要用到的重点 PHP 基础知识:
主要功能分为 用户注册、用户登录、用户退出、用户中心 四个部分。
用户注册主要功能有:
用户登录主要功能有:
用户退出主要功能有:
用户退出主要功能有:
根据功能需求分析,用于记用户信息的 user 表需要的字段如下:
字段名 | 数据类型 | 说明 |
---|---|---|
uid | mediumint(8) | 主键,自动增长 |
username | char(15) | 注册用户名 |
password | char(32) | MD5 加密后的密码 |
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 ;
各页面功能如下:
reg.html 负责收集用户填写的注册信息。教程里只列出关键的代码片段,完整的代码附在本节最后。
注册表单效果图:
reg.php 负责处理用户注册信息。
if(!isset($_POST['submit'])){
exit('非法访问!');
}
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
//注册信息判断
if(!preg_match('/^[\w\x80-\xff]{3,15}$/', $username)){
exit('错误:用户名不符合规定。返回');
}
if(strlen($password) < 6){
exit('错误:密码长度不符合规定。返回');
}
if(!preg_match('/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/', $email)){
exit('错误:电子邮箱格式错误。返回');
}
本段代码首先检测是否 POST 提交访问该页,接下来根据注册要求(用户名 3-15 字符长度,支持汉字、字母、数字及_;密码不得少于 6 位)对用户提交的注册信息进行检测。在检测用户名和电子邮箱时采用了正则检测,关于正则表达式更所信息请参看《PHP 正则表达式》。
//包含数据库连接文件
include('conn.php');
//检测用户名是否已经存在
$check_query = mysql_query("select uid from user where username='$username' limit 1");
if(mysql_fetch_array($check_query)){
echo '错误:用户名 ',$username,' 已存在。返回';
exit;
}
//写入数据
$password = MD5($password);
$regdate = time();
$sql = "INSERT INTO user(username,password,email,regdate)VALUES('$username','$password','$email',
$regdate)";
if(mysql_query($sql,$conn)){
exit('用户注册成功!点击此处 登录');
} else {
echo '抱歉!添加数据失败:',mysql_error(),'
';
echo '点击此处 返回 重试';
}
login.html 负责收集用户填写的登录信息。
javascript 检测及 CSS 样式可参考 reg.html,本部分略去,可直接查看最后附录的完整代码。
login.php 负责处理用户登录与退出动作。
//登录
if(!isset($_POST['submit'])){
exit('非法访问!');
}
$username = htmlspecialchars($_POST['username']);
$password = MD5($_POST['password']);
//包含数据库连接文件
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,' 欢迎你!进入 用户中心
';
echo '点击此处 注销 登录!
';
exit;
} else {
exit('登录失败!点击此处 返回 重试');
}
该段代码首先确认如果是用户登录的话,必须是 POST 动作提交。然后根据用户输入的信息去数据库核对是否正确,如果正确,注册 session 信息,否则提示登录失败,用户可以重试。
该段代码需要在页面开头启用 session_start() 函数,参见下面 退出处理 代码部分。
处理用户退出的代码跟处理登录的代码都在 login.php 里。
session_start();
//注销登录
if($_GET['action'] == "logout"){
unset($_SESSION['userid']);
unset($_SESSION['username']);
echo '注销登录成功!点击此处 登录';
exit;
}
该段代码在处理用户登录的代码之前,只允许以 login.php?action=logout 的方式访问,其他方式都认为是检测用户登录。具体逻辑参看附录完整代码。
my.php 是用户中心,列在教程里作为用户登录检测参考。
';
echo '用户ID:',$userid,'
';
echo '用户名:',$username,'
';
echo '邮箱:',$row<'email'>,'
';
echo '注册日期:',date("Y-m-d", $row['regdate']),'
';
echo '注销 登录
';
?>
用户登录
返回');
}
if(strlen($password) < 6){
exit('错误:密码长度不符合规定。返回');
}
if(!preg_match('/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/', $email)){
exit('错误:电子邮箱格式错误。返回');
}
//包含数据库连接文件
include('conn.php');
//检测用户名是否已经存在
$check_query = mysql_query("select uid from user where username='$username' limit 1");
if(mysql_fetch_array($check_query)){
echo '错误:用户名 ',$username,' 已存在。返回';
exit;
}
//写入数据
$password = MD5($password);
$regdate = time();
$sql = "INSERT INTO user(username,password,email,regdate)VALUES('$username','$password','$email',
$regdate)";
if(mysql_query($sql,$conn)){
exit('用户注册成功!点击此处 登录');
} else {
echo '抱歉!添加数据失败:',mysql_error(),'
';
echo '点击此处 返回 重试';
}
?>
用户登录
登录';
exit;
}
//登录
if(!isset($_POST['submit'])){
exit('非法访问!');
}
$username = htmlspecialchars($_POST['username']);
$password = MD5($_POST['password']);
//包含数据库连接文件
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,' 欢迎你!进入 用户中心
';
echo '点击此处 注销 登录!
';
exit;
} else {
exit('登录失败!点击此处 返回 重试');
}
?>
';
echo '用户ID:',$userid,'
';
echo '用户名:',$username,'
';
echo '邮箱:',$row['email'],'
';
echo '注册日期:',date("Y-m-d", $row['regdate']),'
';
echo '注销 登录
';
?>