當前位置:
首頁 > 最新 > 系統學習PHP之mysqli 高級篇

系統學習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"轉賬失敗

";}

還有部分理論知識,後面再詳細筆記,今天內容就到這裡。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 通通生活史 的精彩文章:

系統學習PHP之mysqli 基礎篇

TAG:通通生活史 |