1.前言
其实登录和注册模块,最重要的是对session和cookie的应用,一般来说,我们都是通过这个来进行用户是否登录判断的,下面我们直接对判断条件和数据库的建立进行说明(省略前端文件)
2.数据库的建立
名称 | 字段 | 字符 | 是否为空 | 是否为主键 | 备注 |
ID编号 | id | int(11) | 否 | 是 |
|
用户名 | username | varchar(30) | 否 | 否 |
|
用户密码 | userpwd | varchar(32) | 否 | 否 |
|
创建时间 | createtime | int(11) | 否 | 否 |
|
创建IP | createip | int(11) | 否 | 否 |
|
DROP DATABASE IF EXISTS userdb;
CREATE DATABASE userdb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE userdb;
CREATE TABLE user(
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(30) DEFAULT NULL,
userpwd varchar(32) DEFAULT NULL,
createtime int(11) NOT NULL,
createip int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
insert into user(username,userpwd) values('admin','admin');
3.注册条件判断文件
//注册的处理文件样板
<?php
session_start();
//注册处理界面 regcheck.php
if(isset($_POST["hidden"]) && $_POST["hidden"] == "hidden")
{
$user = trim($_POST["username"]);//trim()函数移除字符串两侧的空白字符
$psw = md5(trim($_POST["userpwd"]));
$psw_confirm = md5(trim($_POST["confirm"]));
$code = $_POST["code"];
if($user == "" || $psw == "" || $psw_confirm == "")
{
echo "<script>alert('请确认信息完整性!'); history.go(-1);</script>";
}
else if($code != $_SESSION[' ver_code']){
echo "<script>alert('验证码不正确,请重新输入!'); history.go(-1);</script>";
}
else
{
if($psw == $psw_confirm)
{
$conn = mysqli_connect("localhost","root","root"); //连接数据库,帐号密码为自己数据库的帐号密码
if(mysqli_errno($conn)){
echo mysqli_error($conn);
exit;
}
mysqli_select_db($conn,"userdb"); //选择数据库
mysqli_set_charset($conn,'utf8'); //设定字符集
$sql = "select username from user where username = '$user'"; //SQL语句
$result = mysqli_query($conn,$sql); //执行SQL语句
$num = mysqli_num_rows($result); //统计执行结果影响的行数
if($num) //如果已经存在该用户
{
echo "<script>alert('用户名已存在'); history.go(-1);</script>";
}
else //不存在当前注册用户名称
{
$ip=ip2long($_SERVER['REMOTE_ADDR']); // 把ip地址转换成整型
$time=time();
$sql_insert = "insert into `user` (`username`,`userpwd`,`createtime`,`createip`) values('" . $user . "','" . $psw ."','".$time."','".$ip."')";
$res_insert = mysqli_query($conn,$sql_insert);
if($res_insert)
{
echo "<script>alert('注册成功!');window.location.href='login.php';</script>";
}
else
{
echo "<script>alert('系统繁忙,请稍候!'); history.go(-1);</script>";
}
}
}
else
{
echo "<script>alert('密码不一致!'); history.go(-1);</script>";
}
}
}
else
{
echo "<script>alert('提交未成功!');</script>";
}
?>
4.登录条件判断文件
//登陆时候处理文件
<?php
session_start();
//登录处理界面 logincheck.php
//判断是否按下提交按钮
if(isset($_POST["hidden"]) && $_POST["hidden"] == "hidden")
{
//将用户名和密码存入变量中,供后续使用
$user = trim($_POST["username"]);//trim()函数移除字符串两侧的空白字符
$psw = md5(trim($_POST["userpwd"]));//密码使用md5()加密一次,存入数据库
$code = $_POST["code"];
if($user == "" || $psw == "")
{
//用户名或者密码其中之一为空,则弹出对话框,确定后返回当前页的上一页
echo "<script>alert('请输入用户名或者密码!'); history.go(-1);</script>";
}else if($code != $_SESSION[' ver_code']){
echo "<script>alert('验证码不正确,请重新输入!'); history.go(-1);</script>";
}
else
{ //确认用户名密码验证码不为空,则连接数据库
$conn = mysqli_connect("localhost","root","root");//数据库帐号密码为安装数据库时设置
if(mysqli_errno($conn)){
echo mysqli_errno($conn);
exit;
}
mysqli_select_db($conn,"userdb");
mysqli_set_charset($conn,'utf8');
$sql = "select username,userpwd from user where username = '$user' and userpwd = '$psw'";
$result = mysqli_query($conn,$sql);
$num = mysqli_num_rows($result);
if($num)
{
echo "<script>alert('成功登录'); window.location.href='index.php';</script>";
}
else
{
echo "<script>alert('用户名或密码不正确!');history.go(-1);</script>";
}
}
}
else
{
echo "<script>alert('提交未成功!');</script>";
}
?>
5.登录预处理(另一种登录判断)
//login.php
<?php
@session_start();//开启session
header("Content-type:text/html;charset=utf-8");
$link = mysqli_connect('localhost','root','root','login'); //链接数据库
mysqli_set_charset($link ,'utf8'); //设定字符集
//获得传递过来的数据
$name=$_POST['username'];
$pwd=$_POST['password'];
$yzm=$_POST['yzm'];
if($name==''){
echo "<script>alert('请输入用户名');location='" . $_SERVER['HTTP_REFERER'] . "'</script>";
exit;
}
if($pwd==''){
echo "<script>alert('请输入密码');location='" . $_SERVER['HTTP_REFERER'] . "'</script>";
exit;
}
if($yzm!=$_SESSION['VCODE']){
echo"<script>alert('你的验证码不正确,请重新输入');location='".$_SERVER['HTTP_REFERER']. "'</script>";
exit;
}
$sql_select="select id,username,password from user where username= ?";
//从数据库查询信息
//MySQLi预处理语句编译SQL语句
$stmt=mysqli_prepare($link,$sql_select);
//绑定参数
mysqli_stmt_bind_param($stmt,'s',$name);
//执行编译好的SQL语句
mysqli_stmt_execute($stmt);
//将返回的数据绑定到变量上
$result=mysqli_stmt_get_result($stmt);
$row=mysqli_fetch_assoc($result);
if($row){
if($pwd !=$row['password'] || $name !=$row['username']){
echo "<script>alert('密码错误,请重新输入');location.href='login.html'</script>";
exit;
}
else{
$_SESSION['username']=$row['username'];
$_SESSION['id']=$row['id'];
echo "<script>alert('登录成功');location.href='first.html'</script>";
}
}else{
echo "<script>alert('您输入的用户名不存在');location.href='login.html'</script>";
exit;
}
?>
6.MySQLi预处理语句总结
6.1优势
- 安全
- 效率高
6.2编译SQL语句
mysqli_prepare(mysqli $link,string $query)
功能:MySQLi预处理语句编译SQL语句
参数:
link mysqli_connect()产生的mysqli对象
query 编译的SQL语句
返回:mysqli_stmt 对象
6.3绑定参数(可选)
mysqli_stmt_bind_param(mysqli_stmt $stmt,string $type,
mixed $var[,....])
功能:绑定参数
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
type 参数的数据类型
i 整型
s 字符串
d 浮点型
b blob 数据类型
var 具体变量,变量一定要以变量形式传递。
6.4执行
mysqli_stmt_execute(mysqli_stmt $stmt)
功能:执行编译好的SQL语句
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:布尔值
6.5获取被影响行数
mysqli_stmt_affected_rows(mysqli_stmt $stmt)
功能:获取被影响的行数
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:成功:被影响的行数。
失败:-1
6.6获取自增ID
mysqli_stmt_insert_id(mysqli_stmt $stmt)
功能:获取最近一次insert产生的自增ID
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:自增id
6.7将返回数据赋值给变量
mysqli_stmt_bind_result(mysqli_stmt $stmt,mixed $var1[,...])
功能:将返回的数据绑定到变量上
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
var1 返回的数据绑定到变量上
6.8从结果集中获取数据
mysqli_stmt_fetch(mysqli_stmt $stmt)
功能:从结果集中获取数据
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:一次获取一行数据,拿不到时返回NULL
6.9将获取的结果集缓存到客户端
mysqli_stmt_store_result(mysqli_stmt $stmt)
功能:将获取的结果集缓存到客户端
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
6.10获取结果集行数
mysqli_stmt_num_rows(mysqli_stmt $stmt)
功能:获取结果集中的行数
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:行数
6.11释放预处理对象
mysqli_stmt_close(mysqli_stmt $stmt)
功能:释放mysqli_prepare产生的mysqli_stmt 对象
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:布尔值
7.本文总结
登录与注册模块本质上并不难,主要是对用户输入信息的判断、对数据库数据获取的并与用户输入进行对比,而要长期保留用户登录的信息,则使用session保存,而要使用户下次登录免输入则使用cookie长期保存,而在这里我们要注意的知识点上MySQL的预处理、IP地址的获取、输入信息的处理等。
// 把ip地址转换成整型
$ip_int=ip2long($_SERVER['REMOTE_ADDR']);
// 把整型转换成ip地址
$int_ip=long2ip($ip_int);
//密码使用md5()加密
$psw = md5(trim($_POST["userpwd"]));
其他的一些模块和知识点,比如验证码模块、加密技术等等,我会在其他文章详细解读。