预处理(防止sql注入的一种方式)

时间:2024-01-02 12:51:32
<!---     预处理(预编译)      --->

<?php
/*
防止 sql 注入的两种方式:
1. 人为提高代码的逻辑性,使其变得更严谨,滴水不漏。 比如说 增加判断条件,增加输入过滤等,但是智者千虑必有一失。(不推荐)
2. sql 语句的预处理
*/ // 预处理: 就是在程序正式编译之前,事先处理,因为有些功能实现是一样的,只是发生了一些简单的值替换 /*
********** 预处理的原理: ********* insert into register_info values(?,?,?,?); 01. 创建 sql语句模板,并发送到数据库。预留的值使用参数 ? 标记
02. 数据库对模板解析,编译,对sql 语句模板执行查询优化,并存储结果不输出
03. 最多将绑定的参数传给之前 ? 标记的地方,模板执行语句。如果传的参数不一样,模板就可以多次使用。但是对模板的解析只需要做一次 ********** 预处理的优点 *********** 01. 预处理语句大大减少了分析时间,只做了一次增删改查(至于值被多次赋予,已经不需要数据库来操作)
02. 绑定参数减少了服务器带宽,你只需要发送查询或者增加的参数,而不是整个 sql 语句
03. 预处理语句能很好的防止 sql注入,因为参数的发送不会影响一开始对模板的解析,编译,模版又是自己定义的,根本不会有漏洞 */ // 面向对象 // 1. 连接数据库服务器,选择数据库 register
$mysqli = new mysqli('localhost','root','','register'); if ($mysqli){
echo '<h2><i>连接数据库成功</i></h2>'; // 2. 设置字符集
$mysqli->set_charset('utf8'); // 3. 预处理的核心代码(这部分代码数据库只执行一次)
// a. 写sql语句模板 (register_info是已有的表)
$sql = "insert into register_info(id,username,password,email,tel)VALUES (?,?,?,?,?)"; // b. prepare() 方法,预处理阶段
$stmt = $mysqli->prepare($sql); /*------------- 以下代码都是重复执行的,都是由 $stmt 对象操作 --------------*/
// a. 绑定参数 bind_param()
// 给预留的 ? 赋值,要求类型和顺序要和 ? 所表示的一致
/*
格式占位符,格式列表:
i ---> int 整型
s ---> string 字符串
d ---> double 双精度浮点型
b ---> blob(binary large object) 二进制大对象
*/ $id = 2;
$username = '王二';
$password = '1237890';
$email = 'wang@qq.com';
$tel = '12345678987'; $stmt->bind_param('issss',$id,$username,$password,$email,$tel); // b. 开始插入
if ($stmt->execute()){
echo '<h2><i>插入成功</i></h2>';
}else{
echo '<h2><i>插入失败</i></h2>';
} // 4. 关闭预处理
$stmt->close(); // 5. 关闭数据库
$mysqli->close(); }else{
die('连接数据库失败!');
}