zoukankan      html  css  js  c++  java
  • 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 ?>

     结果如下:

  • 相关阅读:
    垃圾回收相关概念
    垃圾回收相关算法
    垃圾回收概述
    StringTable
    执行引擎
    [前端]背景图,中间放大特效
    [Javascript]类数组对象为什么不能用for in进行遍历
    [前端] 画个圈圈显示百分比
    win10 Build 14905.rs_prerelease.160811-1739 填坑记录
    [翻译][10 By 10 外文博客] 01.uwp获得关注并安装
  • 原文地址:https://www.cnblogs.com/seaBiscuit0922/p/5950055.html
Copyright © 2011-2022 走看看