標籤:sql 資料庫 php mysqli 事務
從前天開始,我的電腦不知道怎麼了,寫程式的時候無緣無故就死機。還不是徹底死,滑鼠還能動,就是點擊不好使,也打不開工作管理員。昨晚檢查一下硬碟,有六個壞道,也不知道是不是這個原因。但是我在玩的時候,只要不開啟編譯器寫程式,啥事也沒有。玩遊戲也不回出現那種情況。把我搞得好煩。
四、Mysqli擴充庫增強
MySQLi擴充庫在基礎操作上看著沒什麼不同,只是從面面向過程轉換成了物件導向。但是既然是mysql擴充庫的增強,那一定有強的地方。有如下代碼:
1、批量執行sql語句
<?php //mysqli 的增強,批量執行sql語句 //批量執行dml語句(增刪改) //使用了mysqli::multi_query($sqls)方法 //$sqls = "$sql1;$sql2;..."; //1.得到mysqli對象 //$mysqli=new MySQLi("localhost","root","root","test"); //if($mysqli->connect_error){ // die($mysqli->connect_error); //} //$sqls = "insert into user(name,phone,address)values('張飛',18899992222,'中國');"; //$sqls .= "insert into user(name,phone,address)values('黃飛鴻',18899991111,'中國');"; //$sqls .= "insert into user(name,phone,address)values('王剛',18899993333,'中國');"; //$res = $mysqli->multi_query($sqls); //if(!$res){ // echo "執行失敗"; //}else{ // echo "ok"; //} //$mysqli->close(); //批量執行dml語句的時候可以混合使用:insert delete update語句,但是最好不要插入select語句 //批量執行dql語句(select) //1.開啟mysqli對象 $mysqli=new MySQLi("localhost","root","root","test"); //2.批量查詢 $sqls = "select * from mr_user;"; $sqls.="select * from user;"; //$sqls.="desc user";//顯示表的結構 //3.處理結果 //如果成功,則至少有一個結果集 if($res=$mysqli->multi_query($sqls)){ do{ //從mysqli串連取出第一個結果集 $result = $mysqli->store_result(); //顯示mysqli result對象 while($row=$result->fetch_row()){ foreach($row as $key=>$val){ echo "$val--"; } echo "<br>"; } //使用完第一個結果集後應該及時釋放資源 $result->free(); if(!$mysqli->more_results()){ break; } echo "<br>**************新的結果集************<br>"; }while($mysqli->next_result()); } //4.關閉資源?>
上面用到的資料庫是我自己另建的。
2、mysqli防注入mysqli擴充庫防注入是通過先行編譯機制來做到的。所謂注入就是一些電腦駭客或者攻擊者利用你代碼的缺陷在填寫表單的時候能夠擷取到你的資料庫裡面的資料或者惡意修改等。在mysql擴充庫中,也可以通過代碼最佳化來防止。看一段代碼:
<?php //先行編譯機制,添加三個使用者 //1.建立一個mysqli對象 $mysqli = new MySQLi("localhost","root","root","test"); //2.建立先行編譯對象 $sql = "insert into user (name,phone,address) values(?,?,?)";//問號是預留位置,以後只要用資料替換就ok $mysqli_stmt = $mysqli->prepare($sql); //綁定參數 $name = array("小倩","小白","小黑"); $phone = array("18833332222","18744446666","18899992222"); $address = array("古代","古代","現代"); //參數綁定---->給?賦值 //這裡類型和順序都要對應 for($i=0;$i<3;$i++){ $mysqli_stmt->bind_param("sss",$name[$i],$phone[$i],$address[$i]);//這裡三個s是代表資料類型是字串類型 //執行語句 $b = $mysqli_stmt->execute(); } if(!$b){ die("操作失敗".$mysqli_stmt->error); }else{ echo "操作成功"; } //釋放資源 $mysqli->close();?><?php //先行編譯機制,從資料庫查詢 //使用預先處理的方法,查詢所有Id>8的使用者的id,name ,address //1.建立一個mysqli對象 $mysqli = new MySQLi("localhost","root","root","test"); //2.建立先行編譯對象 $sql = "select id,name,address from user where id>?"; $mysqli_stmt = $mysqli->prepare($sql); $i=8; //綁定參數 $mysqli_stmt->bind_param("i",$i); //由於這次有返回對象了,所以需要綁定結果集 $mysqli_stmt->bind_result($id,$name,$address); //執行 $mysqli_stmt->execute(); //取出綁定的結果集 while($mysqli_stmt->fetch()){ echo "<br>--$id--$name--$address--"; } //如果想再執行一次類似上面的只是$i改變的查詢,那麼就無須綁定結果集 //釋放資源 $mysqli_stmt->free_result(); //關閉先行編譯指令 $mysqli_stmt->close(); //關閉串連 $mysqli->close();?>
3、交易處理事務用於保證資料的一致性,它由一組相關的dml語句組成,該組的dml語句要麼全部成功,要麼全部失敗。通俗一點就是事務可以解決一些誤操作,或者說操作不當。如:網上轉賬就是典型的要用事務來處理,用以保證資料的一致性。假如我要給你轉賬,我的錢打過去了,但由於系統原因你沒收到,那麼就需要用到交易回復,撤銷我剛剛的操作,不能讓我的錢少了你的錢不增。
<?php $mysqli = new MySQLi("localhost","root","root","test"); if($mysqli->connect_error){ die($mysqli->connect_error); } //將提交設為false $mysqli->autocommit(false);//開啟或關閉本次資料庫連接的自動命令提交事務模式 ,這裡設定不要自動認可(false) //這裡相當於做了一個透明的儲存點。會把當前情況記錄下來。 $sql1 = "update account set balance=balance+100 where id = 1"; $sql2 = "update account set balance=balance-100 where id = 2"; $res1 = $mysqli->query($sql1); $res2 = $mysqli->query($sql2); if(!$res1||!$res2){ //復原事務 $mysqli->rollback();//復原到儲存點 echo "fail"; }else{ //提交 $mysqli->commit(); //這裡是真正的提交,一旦提交沒有機會復原。 echo "success"; }?>
使用事務的細節:在mysql控制台也可以使用事務來操作。具體步驟如下:
1.開啟一個事務
start transaction
2.做儲存點,如果不做就預設從事務開始時作為儲存點
savepoint 儲存點名稱
3.操作……
4.可以復原,可以提交
4.1如果沒有問題就提交
commit
4.2如果覺得有問題就復原
rollback to 儲存點
(一旦使用commit提交,儲存點全部清除,無法復原)
事務的acid特性
* 原子性:原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
* 一致性:事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態
* 持久性:事務的隔離性是多個使用者並發訪問資料庫時,資料庫為每一個使用者開啟事務,不能被其他事物的操作資料所幹擾,多個並發事務之間要相互隔離。
* 隔離性:持久性是指一個事務一旦被提交,它對資料庫中的資料的改變就是永久的,接下來即使資料庫發生故障,也不應該對其有任何影響。
這裡我自己寫的mysqli擴充庫內容太少了。還是需要好好看看書。
邊記邊學PHP-(十七)PHP使用MySQLi擴充庫操作資料庫2