1.前言
登录和注册模块,最重要的是对session和cookie的应用,一般来说,我们都是通过这个来进行用户是否登录判断的,下面我们简单的讲解和实现登录预注册模块。
详见OrdLogin.class.php
2.数据库的建立
名称
字段
字符
是否为空
是否为主键
备注
ID编号
id
int(11)
否
是
用户名
username
varchar(30)
否
否
用户密码
userpwd
varchar(32)
否
否
创建时间
createtime
int(11)
否
否
创建IP
createip
int(11)
否
否
快速建立SQL:
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.MySQLi预处理语句总结
mysqli的预处理具有安全和效率高的特点,
3.1mysqli_prepare(mysqli $link,string $query)
功能:
MySQLi预处理语句编译SQL语句
参数:
link mysqli_connect()产生的mysqli对象
query 编译的SQL语句
返回:
mysqli_stmt 对象
3.2mysqli_stmt_bind_param(mysqli_stmt $stmt,string $type,mixed $var[,....])
功能:
绑定参数
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
type 参数的数据类型(i 整型,s 字符串,d 浮点型,b 数据类型)
var 具体变量,变量一定要以变量形式传递。
3.3mysqli_stmt_execute(mysqli_stmt $stmt)
功能:
执行编译好的SQL语句
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:
布尔值
3.4mysqli_stmt_affected_rows(mysqli_stmt $stmt)
功能:
获取被影响的行数
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:
成功返回被影响的行数。
失败返回-1
3.5mysqli_stmt_insert_id(mysqli_stmt $stmt)
功能:
获取最近一次insert产生的自增ID
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:
自增id
3.6mysqli_stmt_bind_result(mysqli_stmt $stmt,mixed $var1[,...])
功能:
将返回的数据绑定到变量上
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
var1 返回的数据绑定到变量上
3.7mysqli_stmt_fetch(mysqli_stmt $stmt)
功能:
从结果集中获取数据
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:
一次获取一行数据,拿不到时返回NULL
3.8mysqli_stmt_store_result(mysqli_stmt $stmt)
功能:
将获取的结果集缓存到客户端
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
3.9mysqli_stmt_num_rows(mysqli_stmt $stmt)
功能:
获取结果集中的行数
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:
行数
3.10mysqli_stmt_close(mysqli_stmt $stmt)
功能:
释放mysqli_prepare产生的mysqli_stmt 对象
参数:
stmt mysqli_prepare 产生的 mysqli_stmt 对象
返回:
布尔值
4.代码展示
这里只展示预处理登录代码,其他代码就不多展示了,有兴趣可以查看项目库
/**
* 登录处理(预处理)
*/
public function preLogin()
{
$name = $_POST['username'];
$pwd = $_POST['password'];
$yzm = $_POST['yzm'];
if ($name == '') {
$data = ['code' => 'error', 'message' => '请输入用户名', 'data' => ''];
}else if ($pwd == '') {
$data = ['code' => 'error', 'message' => '请输入密码', 'data' => ''];
}else if ($yzm != $_SESSION['VCODE']) {
$data = ['code' => 'error', 'message' => '验证码不正确,请重新输入', 'data' => ''];
}else{
$sql_select = "select id,username,password from user where username= ?";
$stmt = mysqli_prepare($this->conn, $sql_select);
mysqli_stmt_bind_param($stmt, 's', $name);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);
if ($row) {
if ($pwd != $row['password'] || $name != $row['username']) {
$data = ['code' => 'error', 'message' => '密码错误,请重新输入', 'data' => ''];
} else {
$_SESSION['username'] = $row['username'];
$_SESSION['id'] = $row['id'];
$data = ['code' => 'ok', 'message' => '成功登录', 'data' => ''];
}
} else {
$data = ['code' => 'error', 'message' => '您输入的用户名不存在', 'data' => ''];
}
}
return json_encode($data);
}
5.本文总结
登录与注册模块本质上并不难,主要是对用户输入信息的判断、对数据库数据获取的并与用户输入进行对比,而要长期保留用户登录的信息,则使用session保存,而要使用户下次登录免输入则使用cookie长期保存,而在此基础上,我们要注意的是MySQL的预处理、IP地址的获取、输入信息的处理等。
比如IP地址的处理:
// 把ip地址转换成整型
$ip_int=ip2long($_SERVER['REMOTE_ADDR']);
// 把整型转换成ip地址
$int_ip=long2ip($ip_int);
比如密码加密:
//密码使用md5()加密
$psw = md5(trim($_POST["userpwd"]));
其他的一些模块和知识点,比如验证码模块、分页模块、文件上传模块、加密技术等,我会在其他文章详细解读。