系統學習PHP之mysqli 高級篇
該文章將記錄mysqli實現多語句查詢、預處理、事務等知識的記錄,相對上一章一般的增刪改查而已較為複雜;
多語句查詢
PHP 實現對 MySQL 多條語句查詢—–針對 INSERT INTO 、DELETE 、UPDATE 語句的查詢:
#1設置頁面內容是html編碼格式是utf-8
header("content-type:text/html;charset=utf-8");
#2 連接資料庫
$mysqli=@newmysqli("localhost","root","root","test");
#3 檢測是否連接成功
if($mysqli->connect_errno){die("資料庫連接失敗,錯誤信息:".$mysqli->connect_error);}
#4 設置字符集
$mysqli->set_charset("UTF8");
#5 拼接多條 SQL 語句
$sql="INSERT user(username,password,age) VALUES("atong","atong",8);";$sql.="UPDATE1 user SET age=18 WHERE id=1;";$sql.="DELETE FROM user WHERE id=5;";
#6 使用multi_query() 代替 query()進行查詢
$res=$mysqli->multi_query($sql);
針對 增、刪、改的多條SQL語句查詢來說:
1).multi_query()逐條執行SQL語句,當其中有一條語句執行失敗,後面的語句不會繼續執行;
2).如果第一條語句執行成功,無論後面有幾條語句執行失敗,返回值都為true;
3).當第一條語句執行失敗,後面的語句不會執行(與1說明情況相同),返回值為false;
4).注意拼寫SQL語句時必須帶上;符
PHP 實現對 MySQL 多條語句查詢—–針對 SELECT 語句的查詢:
#1 拼接多條 SQL 語句:
$sql="SELECT * FROM mysql.user;";$sql.="SELECT CURRENT_USER();";$sql.="SELECT NOW();";
#2 查詢並返回結果
$bool=$mysqli->multi_query($sql);
#3 使用use_result() 或 store_result() 獲取第一條查詢產生的結果集
$mysqli_result=$mysqli->store_result()
#4 將結果集數組存儲為二維數組格式
$rows[]=$mysqli_result->fetch_all(MYSQLI_ASSOC);
#5 檢測是否有更多的結果集
more_results()
#6 將結果集指針向下移動一位
next_result()
重複…3、4、5、6、,即,使用可使用循環實現,將以上歸納:
if($mysqli->multi_query($sql)){do{if($mysqli_result=$mysqli->store_result()){$rows[]=$mysqli_result->fetch_all(MYSQLI_ASSOC);}}while($mysqli->more_results()&&$mysqli->next_result());}else{echo $mysqli->error;}
注意:
1).如果是查詢操作,可以對執行多個查詢語句,並將所有結果集存儲在mysqli對象中,返回true或者false
2).使用use_result()或story_result()獲得multi_query()查詢後的一個結果集(結果集指針當前指向的結果集,從第一條開始);
3).more_result()檢測是否還有更多的結果集,有返回真;
4).next_result()將結果集指針移動指向下一條結果集,移動成功返回真;
預處理
預處理之實現增刪改的操作
#1 編寫SQL語句(注意使用『?』作為佔位符)
$sql="INSERT user(username,password,age) VALUES(?,?,?)";
#2 準備預處理語句(除了???其它已經不會改變)
$mysqli_stmt=$mysqli->prepare($sql);
#3 綁定參數(s,i,d s為字元串,i為整型,d為小數型;)
$username="king";$password=md5("king");$age=12;//綁定參數$mysqli_stmt->bind_param("ssi",$username,$password,$age);
#4 執行預處理語句(返回值是布爾值)
$bool=$mysqli_stmt->execute()
預處理之實現查詢操作
#1 編寫SQL語句
$sql="SELECT id,username,age FROM user WHERE id>=?";
#2 準備(此後mysql不再對 sql 語句進行編譯,可防止SQL注入)
$mysqli_stmt=$mysqli->prepare($sql);
#3 綁定參數
$id=20;$mysqli_stmt->bind_param("i",$id);
#4 執行預處理語句(返回值是布爾值)
$bool=$mysqli_stmt->execute()
#5 綁定結果集中的值到變數
$mysqli_stmt->bind_result($id,$username,$age);
#6 遍歷結果集
while($mysqli_stmt->fetch()){echo"編號:".$id,"
";echo"用戶名:".$username,"
";echo"年齡:".$age."
";echo"";}
1).預處理語句大大減少了分析時間,值在$mysqli_stmt=$mysqli->prepare($sql);時mysql會分析語句.
2).綁定參數減少了伺服器帶寬,你只需要發送查詢的參數,而不是整個語句。
3).預處理語句針對SQL注入是非常有用的,因為參數值發送後使用不同的協議,保證了數據的合法性。
事務
事務的實現過程是關閉自動提交功能,然後編寫多條查詢語句,然後提交查詢,如果某條語句查詢失敗,那麼將回滾全部的語句,下面通過一個小栗子學習PHP中的事務:
# 創建一數據表
CREATE TABLE`NewTable`(`id`smallint NOT NULL AUTO_INCREMENT,`user_name`varchar(255)CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`money`intNOT NULL,PRIMARY KEY(`id`));
# 插入測試數據:
INSERT INTO user_money(`user_name`,`money`)VALUES("Tong",100),("Fan",50);
這裡開始事務的實現
#1 關閉自動提交功能
$mysqli->autocommit(FALSE);
#2 準備第一條查詢語句
$sql="UPDATE user_money SET money=money-10 WHERE user_name="Tong"";$res=$mysqli->query($sql);$res_affect=$mysqli->affected_rows;//影響數量
#3 準備第二條查詢語句
$sql1="UPDATE user_money SET money=money+10 WHERE user_name="Fan"";$res1=$mysqli->query($sql1);$res1_affect=$mysqli->affected_rows;
#4 判斷查詢結果,如果成功則執行,否則回滾
if($res&&$res_affect>&&$res1&&$res1_affect>){//手動提交數據$mysqli->commit();echo"轉賬成功
";//恢復自動提交功能$mysqli->autocommit(TRUE);}else{//事務回滾,任何一條數據都不執行。$mysqli->rollback();echo"轉賬失敗
";}
還有部分理論知識,後面再詳細筆記,今天內容就到這裡。
TAG:通通生活史 |