zoukankan      html  css  js  c++  java
  • PHP mysqli扩展整理,包括面向过程和面向对象的比较事务控制批量执行预处理

      相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析  PHP PDO扩展整理,包括环境配置基本增删改查事务预处理

    介绍

    mysqli是PHP程序与mysql数据库进行数据交互的桥梁,它支持面向过程和面向对象两种方式 .

    面向过程方式

    现在面向对象编程已经成为了主流,mysqli面向过程化的编程方式可能已经没有太多实用价值,但是通过面向对象的和面向过程两种方式实现同一段代码,对体会对象和过程两种编程思想还是很有意义,个人觉得这个比较十分有趣!

    流程图:

     

    实例:

    <?php
    header("content-type:text/html;charset:utf-8");
    //第一步:创建数据库连接并选中要操作的具体数据库
    $conObj =@mysqli_connect('localhost','root','root','test','3306');
    if (mysqli_connect_errno()){
        die("连接失败,错误信息如下".mysqli_connect_error);
    }
    
    //第二步:设置字符集
    mysqli_set_charset($conObj,'utf-8');
    
    //第三步:执行sql语句
    $sql = 'select* from `class`';
    $res = mysqli_query($conObj,$sql);
    
    //第四步:取出查询结果
    while($row = mysqli_fetch_assoc($res)){
        echo '<pre>';
        var_dump($row);
    }
    
    //第五步:关闭结果集并释放数据库连接
    mysqli_free($res);
    mysqli_close($conObj);

    与mysql方式的区别:

    面向过程的mysqli与mysql方式相比大同小异,没有什么本质区别.无非就是每个函数的名字都要加上个i,connect()方法的参数值不同等等

    了解面向过程方式的详细信息请点击:  PHP的mysql扩展整理,操作数据库的实现过程分析

    面向对象方式

    面向过程方式是直接动手操作数据库连接的

    面向对象方式则是把所有需要的函数都放在MySQLi类中,MySQLi类的构造函数可以完成数据库连接的功能,实例化MySQLi类的同时,也就完成了数据库连接

    MySQLi的构造方法和mysqli_connect()方法实现的功能完全相同:

    $conObj =new MySQLi('localhost','root','root','test','3306');

    完成实例化之后,直接调用MySQLi类封装的各种方法就可以完成对数据库的一系列操作

    几乎每一个mysqli面向过程的函数都对应着MySQLi类里的一个成员方法,通过比较两个流程图就可以看出来:

    实例:

    <?php
    header("content-type:text/html;charset:utf-8");
    //第一步:创建数据库连接对象
    $conObj =@new MySQLi('localhost','root','root','test','3306');
    if ($conObj->connect_errno){
        die("连接失败,错误信息如下".$conObj->connect_error);
    }
    
    //第二步:设置字符集
    $conObj ->set_charset('utf-8');
    
    //第三步:执行sql
    $sql = 'select* from `class`';
    $res = $conObj->query($sql);
    
    //第四步:取出查询结果
    while($row =$res->fetch_assoc()){
        echo '<pre>';
        var_dump($row);
    }
    
    //第六步:释放结果集,关闭连接
    $res->free();
    $conObj->close();

    结果集处理

    fetch_all() 抓取所有的结果行并且以关联数据,数值索引数组,或者两者皆有的方式返回结果集。
    fetch_array() 以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果。
    fetch_object() 以对象返回结果集的当前行。
    fetch_row() 以枚举数组方式返回一行结果
    fetch_assoc() 以一个关联数组方式抓取一行结果。
    fetch_field_direct() 以对象返回结果集中单字段的元数据。
    fetch_field() 以对象返回结果集中的列信息。
    fetch_fields() 以对象数组返回代表结果集中的列信息。

    事务

    介绍:

    一组数据库命令一起执行,只要有一条不被执行,其他命令也不会执行,在该命令之前的命令会被回滚,数据返回初始的状态(要么都成功,要么都失败)

    作用:

    1.在操作数据库时能够保护数据的一致性

    2.多个程序并发操作数据库时起到"隔离"作用

    操作步骤

    1.执行多个sql语句:

    $sql = "update `class` set salary=salary+100 where sname='雷小军'";
    $sql2 = "update `class` set salary=salary-200 where sname='马小云'";
    $rise = $conObj->query($sql);
    $down = $conObj->query($sql2);

    2.开启事务:

    $conObj->query('start transaction');

    3.进行判断,如果如果执行成功,一起提交,如果失败,回滚:

    if ($rise && $down){
        echo '提交';
        $conObj->commit();
    }
    else{
        echo '失败';
        $conObj->rollback();
    }

     

    完整实例如下

    通过事务进行调整两名员工的工资:

    <?php
    header("content-type:text/html;charset:utf-8");
    
    $conObj =new MySQLi('localhost','root','root','test','3306');
    if ($conObj->connect_errno){
        die("连接失败,错误信息如下".$conObj->connect_error);
    }
    $conObj ->set_charset('utf-8');
    
    $conObj->query('start transaction');
    
    $sql = "update `class` set salary=salary+100 where sname='雷小军'";
    $sql2 = "update `class` set salary=salary-200 where sname='李铁柱'";
    $rise = $conObj->query($sql);
    $down = $conObj->query($sql2);
    
    if ($rise && $down){
        echo '成功';
        $conObj->commit();
    }
    else{
        echo '失败';
        $conObj->rollback();
    }
    
    $conObj->close();

    通过字符串拼接进行批量数据库操作

    将多条sql语句赋值给同一个变量,使用字符串连接符,注意除了最后一个sql语句外末尾都要加上分号:

    $sql = "update `class` set salary=salary+100 where sname='雷小军';";
    $sql .= "update `class` set salary=salary-200 where sname='李铁柱';";
    $sql .= "update `class` set salary=salary-200 where sname='马小云'";
    $conObj->multi_query($sql)

    如果是dml操作,还需要几个特定的方法取到查询结果

    multi_query()获取查询的结果集

    因为是多个select语句,所以遍历到的结果集也会有多个

    会有一个指针指向当前的结果集,store_result()方法将返回指针当前的结果集的内容

    more_results()检测指向的当前结果集后面还是否有其他如果more_results()返回的值为真,就调用next_result()

    header("content-type:text/html;charset:utf-8");
    $conObj =new MySQLi('localhost','root','root','test','3306');
    if ($conObj->connect_errno){
        die("连接失败,错误信息如下".$conObj->connect_error);
    }
    $conObj ->set_charset('utf-8');
    $sql ="select* from testchage;";
    $sql .="select* from class";
    
    if($conObj->multi_query($sql)){
        do {
            $res = $conObj->store_result();
            echo '<br /><pre>*********************<br />';
            while($row = $res->fetch_assoc()){
                    foreach ($row as $val) {
                        echo '<pre>';
                        echo "---$val";
                }
            }
            $res->free();
            if (!$conObj->more_results()) {
                break;
            }
        }
        while ($pro = $conObj->next_result());
    }
    else{
        echo '执行失败'.$conObj->error;
    }
    $conObj->close();

    预处理

    介绍:普通方式执行多条sql语句时,每次执行一条sql语句就要编译一次,采用预处理机制无论有多少条sql语句,都只需要编译一次(当前前提是所有的sql语句都必须是结构相同,只有参数不同的)

    优点: 1.大大提高了程序的执行速度:

        2.可以防止sql注入攻击

        3.操作更加方便

    <?php
    header("content-type:text/html;charset:utf-8");
    $conObj =new MySQLi('localhost','root','root','test','3306');
    if ($conObj->connect_errno){
        die("连接失败,错误信息如下".$conObj->connect_error);
    }
    $conObj ->set_charset('utf-8');
    
    //准备好sql语句,参数使用?填充
    $sql ="insert into `class` values(?,?,?,?,?)";
    //创建预编译对象,并为其绑定参数
    //这个操作实现了预编译,也把sql语句和参数联系了起来,sql语句中每一个?对应这里的bind_param方法的一个参数
    $stmt =$conObj->prepare($sql);
    $stmt->bind_param('isssd',$id,$sname,$gender,$company,$salary);
    
    
    $id =14;
    $sname ='霍华德沃洛维茨';
    $gender ='男';
    $company='NASA';
    $salary=20000;
    if ($stmt->execute()){
        echo '操作执行成功';
    }else{
        echo '执行失败,错误信息'.$stmt->error;
    }
    
    $id =15;
    $sname ='伯纳黛特';
    $gender ='女';
    $company='制药公司';
    $salary=20000;
    if ($stmt->execute()){
        echo '操作执行成功';
    }else{
        echo '执行失败,错误信息'.$stmt->error;
    }
    
    $id =16;
    $sname ='拉杰什罗摩衍那库斯拉帕';
    $gender ='男';
    $company='麻省理工';
    $salary=20000;if ($stmt->execute()){
        echo '操作执行成功';
    }else{
        echo '执行失败,错误信息'.$stmt->error;
    }
    
    //第六步:关闭连接
    $stmt->close();
    $conObj->close();

    prepare()方法作用是将sql语句进行预编译

    bind_param()方法为预编译对象绑定参数,bind_param()方法有多个参数:

    第一个参数是输入的类型,以上面代码为例,bind_param()的第一个参数为isssd,表示sql语句的五个输入参数分别是int(i) string(s) string(s) string(s) double(d)类型

    同理如果需要操作的是"id 用户名 密码"三个字段就是'iss':int string string

    需要注意的是这里只支持这四种数据类型:

      i:int(整型)

      d:double(浮点型)

      s:string(字符串型)

      b:boolean(布尔类型)

    后面的参数就是对sql语句的填充,有几个问号后面就要有几个参数

    完成参数绑定之后,后面不管有多少个sql语句,都只需要提供需要的参数然后执行execute()方法提交就完事了

  • 相关阅读:
    C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类
    [AngularJS + Webpack] Requiring CSS & Preprocessors
    [AngularJS + Webpack] Requiring Templates
    [AngularJS + Webpack] ES6 with BabelJS
    [Flux] 3. Actions
    [RxJS] Aggregating Streams With Reduce And Scan using RxJS
    [RxJS] map vs flatMap
    [RxJS] Stream Processing With RxJS vs Array Higher-Order Functions
    [MODx] Solve cannot upload large file
    [React + webpack] hjs-webpack
  • 原文地址:https://www.cnblogs.com/iszhangk/p/11494488.html
Copyright © 2011-2022 走看看