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

  • 提出问题

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

方法一:for循环100次

方法二:使用批量添加

  $sqls="insert xxx";

  $sqls.="insert xxx";

  ......

  $mysqli->multi_query($sqls);

显然,上述方法效率低。

提高效率的方法一般有:

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

所以提出方法三:预编译

  • 预编译

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

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

  • 案例1

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

 1 <?php
 2     //需求:使用预编译方式向数据库添加三个用户
 3     //连接数据库
 4     $mysqli=new MySQLi("localhost","root","root","test");
 5     //修改字符集
 6     $mysqli->query("set names utf8");
 7     //创建预编译对象
 8     $sql="insert into user1 (name,password,age,birthday) values (?,?,?,?)";
 9     $mysqli_stmt=$mysqli->prepare($sql);
10 
11     //绑定参数1
12     $name="zx";
13     $password="123456";
14     $age=28;
15     $birthday="1989-08-08";
16     //给?赋值,类型和顺序要对应
17     $mysqli_stmt->bind_param("ssis",$name,$password,$age,$birthday);
18     //执行
19     $res1=$mysqli_stmt->execute();
20     //判断结果
21     if(!$res1){
22         die("操作1失败".$mysqli_stmt->error);
23         echo "<br/>";
24     }else{
25         echo "操作1成功<br/>";
26     }
27 
28     //绑定参数2
29     $name="zx2";
30     $password="123456";
31     $age=28;
32     $birthday="1989-08-09";
33     //给?赋值,类型和顺序要对应
34     $mysqli_stmt->bind_param("ssis",$name,$password,$age,$birthday);
35     //执行
36     $res2=$mysqli_stmt->execute();
37     //判断结果
38     if(!$res2){
39         die("操作2失败".$mysqli_stmt->error);
40         echo "<br/>";
41     }else{
42         echo "操作2成功<br/>";
43     }
44 
45     //绑定参数3
46     $name="zx3";
47     $password="123456";
48     $age=28;
49     $birthday="1989-08-03";
50     //给?赋值,类型和顺序要对应
51     $mysqli_stmt->bind_param("ssis",$name,$password,$age,$birthday);
52     //执行
53     $res3=$mysqli_stmt->execute();
54     //判断结果
55     if(!$res3){
56         die("操作3失败".$mysqli_stmt->error);
57         echo "<br/>";
58     }else{
59         echo "操作3成功<br/>";
60     }
61 
62     //关闭连接
63     $mysqli->close();
64 ?>

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

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

结果如下:

  • 案例2

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

 1 <?php
 2     //连接数据库
 3     $mysqli=new MySQLi("localhost","root","root","test");
 4     if(mysqli_connect_error()){
 5         die("连接失败".mysqli_connect_error());
 6     }
 7     //修改字符集
 8     $mysqli->query("set names utf8");
 9     //创建预编译对象,查询id>?的记录
10     $sql="select id,name,age,birthday from user1 where id>?";
11     $mysqli_stmt=$mysqli->prepare($sql);
12 
13     //绑定参数1
14     $id=5;
15     $mysqli_stmt->bind_param("i",$id);
16     //绑定结果集
17     $mysqli_stmt->bind_result($id,$name,$age,$birthday);
18     //执行
19     $mysqli_stmt->execute();
20     //取出绑定的值
21     while($row=$mysqli_stmt->fetch()){
22         echo "$id--$name--$age--$birthday<br/>";
23     }
24 
25     echo "***************************************<br/>";
26 
27     //绑定参数2
28     $id=8;
29     //执行
30     $mysqli_stmt->execute();
31     //取出绑定的值
32     while($row=$mysqli_stmt->fetch()){
33         echo "$id--$name--$age--$birthday<br/>";
34     }
35 
36     //释放结果
37     $mysqli_stmt->free_result();
38     //关闭预编译语句
39     $mysqli_stmt->close();
40     //关闭连接
41     $mysqli->close();
42 ?>

 结果如下:

原文地址:https://www.cnblogs.com/seaBiscuit0922/p/5950055.html