1、预处理是为了什么?
我们在查数据库时,有时要用到一些结构相同,只有参数不同的SQL语句,使用预处理这种方式,可以让我们在查询数据库的时候,提高速度。
2、预处理是怎样提高查询速度的?
通常我们在查询数据库的时候,我们的SQL语句和参数是同时在数据库系统中经过编译执行的,在批量查询时,我们要不停的经过编译执行的过程获取数据库中的数据,预处理将SQL语句与参数的传递分开进行:我们先将所要用的SQL结构进行新编译,然后每次要查询数据库时,仅仅将变量传进去,不再去编译SQL语句,换句话说,我们创建了一个预处理语句,就相当于在数据系统里建立了一个“功能站”,每次查数据库就相当于往“功能站”里添加参数,即使多次查询,仍然只做一次SQL编译,速度自然提升。
3、预处理为什么能够从根本上解决SQL注入问题?
因为预处理,SQL语句的编译和参数的传递是分开进行的,而参数传递进入数据库后统一当成字符串处理,所以即使传进的参数有注入语句,默认当做字符串处理,也就对数据库构不成威胁了。
4、预处理的代码实现
<?php
//预处理技术
//创建一个mysqli对象
$mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名");
//判断是否链接成功
if($mysqli->connect_error){
die($mysqli->connect_error);
}
//创建预编译对象
$sql = "insert into 表名 (name,qq,age) values (?,?,?)";
$mysqli_compile = $mysqli->prepare($sql);
//绑定参数
$name="tao";
$qq="12345678";
$age="20";
//给?处进行赋值,"ssi"指string,string,int,数据类型和顺序一一对应,注:‘i’->int,'s'->string,'d'->double float
//bind_param()这里参数数目是可变。
$mysqli_compile->bind_param("ssi",$name.$qq,$age);
//执行语句,返回布尔值
$res = $mysqli_compile->execute();
//失败打印出原因
if(!$res){
die("失败原因=".$mysqli_compile-error);
}
//关闭资源
$musqli->close();
?>