概念
预处理语句是一种特殊的数据库操作方式,先定义一个SQL语句模板,然后再填充具体的数据。
作用
防止SQL注入
-
参数化查询:在预处理语句中,数据是通过参数传递的,而不是直接拼接到SQL语句中。这意味着即使参数中包含SQL命令,数据库也不会将其解释为SQL命令,因为数据库在预处理阶段已经确定了SQL语句的结构。
-
自动转义:数据库接口会自动对传递的参数值进行转义,这可以防止特殊字符被解释为SQL语法的一部分。
优化代码结构
- 编译优化:数据库可以预先编译SQL语句模板,当使用相同的模板但不同参数执行多次操作时,可以减少编译时间。
SQL语句预处理
1.连接数据库
$address = '127.0.0.1';
$lname = 'root';
$lpasswd = 'root';
initalize_con = new mysqli(address,lname,lpasswd)
2.准备SQL语句模板
使用占位符(?)代替实际写入的参数
$sql = "INSERT INTO login.login_tables(name,password)VALUE(?,?)";
3.使用mysqli对象内prepare()方法准备SQL语句
prapare():mysqli
对象方法
用于准备一个SQL语句,以便后续使用。
接受一个SQL语句作为参数,返回一个mysqli_stmt
对象,该对象用于后续的参数绑定和执行。
$stmt = initalize_con-\>prepare(sql);
4.使用mysqli_stmt对象中bind_param()方法绑定参数及其类型
bind_param():mysqli_stmt对象方法
用于将PHP变量与SQL语句中的参数占位符绑定,并指定参数的数据类型。类型指定符如下:
s
:字符串i
:整数d
:双精度浮点数
stmt-\>bind_param("ss",name,$passwd);
5.添加数据
6.运行SQL语句
execute():``mysqli_stmt
对象
用于执行一个预处理的SQL语句。根据语句类型的不同,可以直接使用变量接收,或通过调用get_result()
获取查询结果集。
$end = $stmt->execute();
7.使用get_result接收查询sql语句执行后的结果集对象
get_result():mysqli_stmt
对象
获取预处理语句的执行结果,并返回一个mysqli_result
对象,该对象包含了查询结果集。
对于非查询类SQL语句(如INSERT
、UPDATE
、DELETE
),使用get_result()
会返回false
,因为这些操作不返回结果集,它们只是对数据库进行修改。
$res = $stmt->get_result();
8.关闭预处理和数据库连接
关闭预处理用于释放资源,避免报错,编码规范
$stmt->close();
$initalize_con->close();