mysqli 扩展库的预处理技术(mysqli_stmt)

时间:2023-03-09 07:27:36
mysqli 扩展库的预处理技术(mysqli_stmt)
  • 提出问题

现在需要向mysql数据库中添加100个用户,请问如何实现?

方法一:for循环100次

方法二:使用批量添加

  $sqls="insert xxx";

  $sqls.="insert xxx";

  ......

  $mysqli->multi_query($sqls);

显然,上述方法效率低。

提高效率的方法一般有:

1、减少数据库连接次数;2、减少数据库编译时间。

所以提出方法三:预编译

  • 预编译

注意:预编译和编译都是在数据库完成。

优点:1、效率高,执行速度块;2、安全性高,可以防止sql注入。

  • 案例1

使用预编译的方式向数据库添加三个用户:

 <?php
//需求:使用预编译方式向数据库添加三个用户
//连接数据库
$mysqli=new MySQLi("localhost","root","root","test");
//修改字符集
$mysqli->query("set names utf8");
//创建预编译对象
$sql="insert into user1 (name,password,age,birthday) values (?,?,?,?)";
$mysqli_stmt=$mysqli->prepare($sql); //绑定参数1
$name="zx";
$password="123456";
$age=28;
$birthday="1989-08-08";
//给?赋值,类型和顺序要对应
$mysqli_stmt->bind_param("ssis",$name,$password,$age,$birthday);
//执行
$res1=$mysqli_stmt->execute();
//判断结果
if(!$res1){
die("操作1失败".$mysqli_stmt->error);
echo "<br/>";
}else{
echo "操作1成功<br/>";
} //绑定参数2
$name="zx2";
$password="123456";
$age=28;
$birthday="1989-08-09";
//给?赋值,类型和顺序要对应
$mysqli_stmt->bind_param("ssis",$name,$password,$age,$birthday);
//执行
$res2=$mysqli_stmt->execute();
//判断结果
if(!$res2){
die("操作2失败".$mysqli_stmt->error);
echo "<br/>";
}else{
echo "操作2成功<br/>";
} //绑定参数3
$name="zx3";
$password="123456";
$age=28;
$birthday="1989-08-03";
//给?赋值,类型和顺序要对应
$mysqli_stmt->bind_param("ssis",$name,$password,$age,$birthday);
//执行
$res3=$mysqli_stmt->execute();
//判断结果
if(!$res3){
die("操作3失败".$mysqli_stmt->error);
echo "<br/>";
}else{
echo "操作3成功<br/>";
} //关闭连接
$mysqli->close();
?>

注意:1、程序执行过程中,某个sql语句执行不成功,并不会中断程序执行,会继续向下执行;

2、第二次之后,不用绑定参数也可以,即34、51行可以省略。

结果如下:

mysqli 扩展库的预处理技术(mysqli_stmt)

mysqli 扩展库的预处理技术(mysqli_stmt)

  • 案例2

查询数据库中id>?的记录,并在网页显示:

 <?php
//连接数据库
$mysqli=new MySQLi("localhost","root","root","test");
if(mysqli_connect_error()){
die("连接失败".mysqli_connect_error());
}
//修改字符集
$mysqli->query("set names utf8");
//创建预编译对象,查询id>?的记录
$sql="select id,name,age,birthday from user1 where id>?";
$mysqli_stmt=$mysqli->prepare($sql); //绑定参数1
$id=5;
$mysqli_stmt->bind_param("i",$id);
//绑定结果集
$mysqli_stmt->bind_result($id,$name,$age,$birthday);
//执行
$mysqli_stmt->execute();
//取出绑定的值
while($row=$mysqli_stmt->fetch()){
echo "$id--$name--$age--$birthday<br/>";
} echo "***************************************<br/>"; //绑定参数2
$id=8;
//执行
$mysqli_stmt->execute();
//取出绑定的值
while($row=$mysqli_stmt->fetch()){
echo "$id--$name--$age--$birthday<br/>";
} //释放结果
$mysqli_stmt->free_result();
//关闭预编译语句
$mysqli_stmt->close();
//关闭连接
$mysqli->close();
?>

结果如下:

mysqli 扩展库的预处理技术(mysqli_stmt)