【二十二】mysqli事務處理
阿新 • • 發佈:2017-12-08
param from word 錯誤 int 知識點 http 成了 修改方法
事務處理
事務基本原理
- 如果不開啟事務,執行一條sql,馬上會持久化數據。可見:默認的mysql對sql語句的執行是自動提交的!
- 如果開啟了事務,就是關閉了自動提交的功能,改成了commit執行自動提交
自動提交的特征是保存在服務器的一個叫做autocommit的一個變量內。使用set 變量名=變量值的形式就可以完成修改(set autocommit=0;),此時就關閉了自動提交功能,需要手動執行commit讓數據持久化
事務的特點(acid)
- 原子性(atomicity)- 要不成功,要不失敗。如果成功就必須完全應用到數據庫,如果失敗則不對數據庫有任何影響
- 一致性(consistency)- 是指一個事務執行之前和執行之後都處於一致性狀態
- 隔離性(lsolation)- 多個事務之間的隔離關系
- 持久性(durability)- 一旦提交就不可能在被回滾
事務的操作
- 回滾(rollback)
- 提交(commit)
- 開始事務(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事務處理