1. 程式人生 > >【二十二】mysqli事務處理

【二十二】mysqli事務處理

param from word 錯誤 int 知識點 http 成了 修改方法

事務處理

事務基本原理

  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=‘[email protected];
18     $age=‘200‘;
19     //執行準備好的sql
20     $b=$sql_stmt->execute();
21 //添加第二個
22     $name=‘zhubajie‘;
23     $Password=‘123‘;
24     $Email=‘[email protected];
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:\wamp64\www\shiwu2.php on line 12”,一直在綁定參數哪裏找問題。

原因:sql語句寫錯了。解決方案:在執行sql的時候判斷語句是否執行錯誤並打印錯誤信息

2.(預處理dql語句)第九行與第12行的參數要對應-name

【二十二】mysqli事務處理