• 【二十二】mysqli事务处理与预处理总结


    事务处理

    事务基本原理

    1. 如果不开启事务,执行一条sql,马上会持久化数据。可见:默认的mysql对sql语句的执行是自动提交的!
    2. 如果开启了事务,就是关闭了自动提交的功能,改成了commit执行自动提交

      自动提交的特征是保存在服务器的一个叫做autocommit的一个变量内。使用set 变量名=变量值的形式就可以完成修改(set autocommit=0;),此时就关闭了自动提交功能,需要手动执行commit让数据持久化

    事务的特点(acid)

    • 原子性(atomicity)- 要不成功,要不失败。如果成功就必须完全应用到数据库,如果失败则不对数据库有任何影响
    • 一致性(consistency)- 是指一个事务执行之前和执行之后都处于一致性状态
    • 隔离性(lsolation)- 多个事务之间的隔离关系
    • 持久性(durability)- 一旦提交就不可能在被回滚

    事务的操作

    1. 回滚(rollback)
    2. 提交(commit)
    3. 开始事务(begin、start transaction)

    事物的语法

    • 开启事务(start transation;)
    • 做保存点(savepoint a;)
    • 执行操作
    • 回滚(rollback to a;)
    • 提交(commit)

    mysqli操作数据(面向对象风格)

    <?php
    //数据库:create table account(id int primary key,balance float);
    //银行转账
        $mysqli=new MySQLi("localhost",'root','','test');
        if ($mysqli->connect_error) {
            echo $mysqli->connect_error;
        }
        //将提交设为假
        $mysqli->autocommit(FALSE);
        $sql1="update account22 set balance=balance+2 where id='1';";
        $sql2="update account1 set balance=balance-2 where id='2';";
        $a=$mysqli->query($sql1);
        $b=$mysqli->query($sql2);
        //判断语句是否为真
        if (!$a || !$b) {
            //其中有一个不成功即回滚不提交
            echo "失败回滚".$mysqli->error;
            $mysqli->rollback();
        }else{
            //所有均成功则提交
            echo "成功";
            $mysqli->commit();
        }
        $mysqli->close();
    ?>

    在学习这个知识点所遇到的问题:代码没问题,在执行事务的时候,rollback不生效。

    原因:我的数据库及表不是INNODB和BDB类型的(MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其它类型是不支持的!)

    解决方法:将数据库及表修改为INNODB类型。修改方法参照:http://aiezu.com/article/83.html

     预处理

    预处理的好处

    • 效率高,执行速度快
    • 安全性高,可以防止sql注入

    示例:

    预处理dml语句

     1 <?php
     2     $mysqli=new mysqli("127.0.0.1","root","","test");
     3     if (!$mysqli->connect_error) {
     4         echo $mysqli->connect_error;
     5     }
     6 //预处理及绑定
     7     $sql="INSERT INTO user1 (name,Password,Email,age)VALUES ( ?,?,?,?);";
     8     //prepare 准备执行的sql语句
     9     $sql_stmt=$mysqli->prepare($sql) or die($mysqli->error);
    10     //参数绑定
    11     //bind_param:将变量作为参数绑定到预处理语句
    12     //这里的类型和顺序要对应
    13     $sql_stmt->bind_param('sssi',$name,$Password,$Email,$age);
    14 // 设置参数并执行
    15     $name='sunwukong';
    16     $Password='123';
    17     $Email='sunwukong@qq.com';
    18     $age='200';
    19     //执行准备好的sql
    20     $b=$sql_stmt->execute();
    21 //添加第二个
    22     $name='zhubajie';
    23     $Password='123';
    24     $Email='zhubajie@qq.com';
    25     $age='200';
    26     $b=$sql_stmt->execute();
    27 //判断是否插入成功
    28     if (!$b) {
    29         echo "操作失败".$sql_stmt->error;
    30     }else{
    31         echo "操作成功";
    32     }
    33     //释放
    34     $mysqli->close();
    35 ?>

    预处理dql语句

     1  <?php
     2     $mysqli=new mysqli("127.0.0.1","root","","test");
     3     if (!$mysqli->connect_error) {
     4         echo $mysqli->connect_error;
     5     }
     6     //1.预处理及绑定
     7     //2.参数设置
     8     //3.执行
     9     $sql="select name from user1 where id>?";
    10     $stmt=$mysqli->prepare($sql) or die($mysqli->error) ;
    11     $id=3;
    12     $stmt->bind_param("i",$id);
    13     //bind_result:将变量绑定到预先准备好的语句以获得结果存储
    14     $stmt->bind_result($name);
    15     $stmt->execute();
    16     while ($stmt->fetch()) {
    17         echo $name."<br/>";
    18     }

        $stmt->free_result();
        $stmt->close();

    19 ?> 

    在学习中遇到的问题

    1.(预处理dql语句)执行语句的时候一直提示“Fatal error: Call to a member function bind_param() on boolean in D:wamp64wwwshiwu2.php on line 12”,一直在绑定参数哪里找问题。

    原因:sql语句写错了。解决方案:在执行sql的时候判断语句是否执行错误并打印错误信息

    2.(预处理dql语句)第九行与第12行的参数要对应-name

  • 相关阅读:
    编写你自己的单点登录(SSO)服务
    SignalR + KnockoutJS + ASP.NET MVC4 实现井字游戏
    Quartz使用总结
    Quartz.Net入门
    ASP.NET批量下载文件的方法
    Asp.Net文件的上传和下载
    AOP实践—ASP.NET MVC5 使用Filter过滤Action参数防止sql注入,让你代码安全简洁
    ASP.NET MVC4中的异步控制器
    Mybatis表关联一对多、多对一、多对多
    Xamarin android使用Sqlite做本地存储数据库
  • 原文地址:https://www.cnblogs.com/8013-cmf/p/8000565.html
Copyright © 2020-2023  润新知