mysqli提供了面向對象和面向過程兩種方式來與數據庫交互,分別看一下這兩種方式。
1、面向對象
在面向對象的方式中,mysqli被封裝成一個類,它的構造方法如下:
立即學習“PHP免費學習筆記(深入)”;
__construct?([?string?$host?[,?string?$username?[,?string?$passwd?[,?string?$dbname[,?int?$port?[,?string?$socket?]]]]]]?)
在上述語法中涉及到的參數說明如下。
host:連接的服務器地址。
username:連接數據庫的用戶名,默認值是服務器進程所有者的用戶名。
passwd:連接數據庫的密碼,默認值為空。
dbname:連接的數據庫名稱。
port:TCP端口號。
socket:UNIX域socket。
要建立與MySQL的連接可以通過其構造方法實例化mysqli類,例如下面的代碼:
<?php $db_host="localhost"; //連接的服務器地址 $db_user="root"; //連接數據庫的用戶名 $db_psw="root"; //連接數據庫的密碼 $db_name="sunyang"; //連接的數據庫名稱 $mysqli=new mysqli($db_host,$db_user,$db_psw,$db_name); ?>
mysqli還提供了一個連接MySQL的成員方法connect()。當實例化構造方法為空的mysqli類時,用mysqli對象調用connect()方法同樣可連接MySQL,例如,下面的代碼:
<?php $db_host="localhost"; //連接的服務器地址 $db_user="root"; //連接數據庫的用戶名 $db_psw="root"; //連接數據庫的密碼 $db_name="sunyang"; //連接的數據庫名稱 $mysqli=new mysqli(); $mysqli->connect($db_host,$db_user,$db_psw,$db_name); ?>
關閉與MySQL服務器的連接通過mysqli對象調用close()方法即可,例如:
$mysqli->close();
2、面向過程
在面向過程的方式中,mysqli擴展提供了函數mysqli_connect()與MySQL建立連接,該函數的語法格式如下:
mysqli?mysqli_connect?([?string?$host?[,?string?$username?[,?string?$passwd[,?string?$dbname?[,?int?$port?[,?string?$socket?]]]]]]?)
mysqli_connect()函數的用法與mysql擴展中的mysql_connect()函數用法十分相似,下面是mysqli_connect()函數的用法示例:
<?php $connection = mysqli_connect("localhost","root","root","sunyang"); if ( $connection ) { echo "數據庫連接成功"; }else { echo "數據庫連接失敗"; } ?>
關閉與MySQL服務器的連接使用mysqli_close()函數,例如:
mysqli_close();
3、使用mysqli存取數據
使用mysqli存取數據也包括面向對象和面向過程兩種方式,在本節我們只討論如何使用面向對象的方式來與MySQL交互,關于mysqli擴展中使用面向過程方式這里就不再詳細介紹了,有興趣的讀者可參考官方文檔來獲取相關的資料。
在mysqli中,執行查詢使用query()方法,該方法的語法格式如下:
mixed?query?(?string?$query?[,?int?$resultmode?]?)
在上述語法中涉及到的參數說明如下:
query:向服務器發送的SQL語句。
resultmode:該參數接受兩個值,一個是MYSQLI_STORE_RESULT,表示結果作為緩沖集合返回;另一個是MYSQLI_USE_RESULT,表示結果作為非緩沖集合返回。
下面是使用query()方法執行查詢的例子:
query($query); ????if?($result)?{ ????????if($result->num_rows>0){?//判斷結果集中行的數目是否大于0 ????????????while($row?=$result->fetch_array()?){?//循環輸出結果集中的記錄 ????????????????echo?($row[0])."
"; ????????????????echo?($row[1])."
"; ????????????????echo?($row[2])."
"; ????????????????echo?($row[3])."
"; ????????????????echo?"
"; ????????????} ????????} ????}else?{ ????????echo?"查詢失敗"; ????} ????$result->free(); ????$mysqli->close(); ?>
在上面代碼中,num_rows為結果集的一個屬性,返回結果集中行的數目。方法fetch_array()將結果集中的記錄放入一個數組中并將其返回。最后使用free()方法將結果集中的內存釋放,使用close()方法將數據庫連接關閉。
對于刪除記錄(delete)、保存記錄(insert)和修改記錄(update)的操作,也是使用query()方法來執行的,下面是刪除記錄的例子:
query($query); ????if?($result){ ????????echo?"刪除操作執行成功"; ????}else?{ ????????echo?"刪除操作執行失敗"; ????} ????$mysqli->close(); ?>
保存記錄(insert)、修改記錄(update)的操作與刪除記錄(delete)的操作類似,將SQL語句進行相應的修改即可。
4、預處理語句
使用預處理語句可提高重復使用語句的性能,在PHP中,使用prepare()方法來進行預處理語句查詢,使用execute()方法來執行預準備語句。PHP有兩種預處理語句:一種是綁定結果,另一種是綁定參數。
(1)綁定結果
所謂綁定結果就是把PHP腳本中的自定義變量綁定到結果集中的相應字段上,這些變量就代表著所查詢的記錄,綁定結果的示例代碼如下:
prepare($query);?//進行預準備語句查詢 ????$result->execute();?//執行預準備語句 ????$result->bind_result($id,$number,$name,$age);?//綁定結果 ????while?($result->fetch())?{ ????????echo?$id; ????????echo?$number; ????????echo?$name; ????????echo?$age; ????} ????$result->close();?//關閉預準備語句 ????$mysqli->close();?//關閉連接 ?>
在綁定結果的時候,腳本中的變量要與結果集中的字段一一對應,綁定完以后,通過fetch()方法將綁定在結果集中的變量一一取出來,最后將預處理和數據庫連接分別關閉。
(2)綁定參數
所謂綁定參數就是把PHP腳本中的自定義變量綁定到SQL語句中的參數(參數使用 “?”代替)上,綁定參數使用bind_param()方法,該方法的語法格式如下:
bool?bind_param?(?string?$types?,?mixed?&$var1?[,?mixed?&$...?]?)
在上述語法中涉及到的參數說明如下。
types:綁定的變量的數據類型,它接受的字符種類包括4個,如下表所示(參數types接受的字符的種類和綁定的變量需要一一對應)。
var1:綁定的變量,其數量必須要與SQL語句中的參數數量保持一致。
綁定參數的示例代碼如下:
prepare($query); ????$result->bind_param("ssi",$number,$name,$age);?//綁定參數 ????$number='sy0807'; ????$name='employee7'; ????$age=20; ????$result->execute();?//執行預準備語句 ????$result->close(); ????$mysqli->close(); ?>
在一個腳本中還可以同時綁定參數和綁定結果,示例代碼如下:
prepare($query); ????$result->bind_param("i",$emp_id);?//綁定參數 ????$emp_id=4; ????$result->execute(); ????$result->bind_result($id,$number,$name,$age);?//綁定結果 ????while?($result->fetch())?{ ????????echo?$id."
"; ????????echo?$number."
"; ????????echo?$name."
"; ????????echo?$age."
"; ????} ????$result->close(); ????$mysqli->close(); ?>
5、多個查詢
mysqli擴展提供了能連續執行多個查詢的multi_query()方法,該方法的語法格式如下:
bool?mysqli_multi_query?(?mysqli?$link?,?string?$query?)
在執行多個查詢時,除了最后一個查詢語句,每個查詢語句之間要用“;”分開。執行多個查詢的示例代碼如下:
?$mysqli=new?mysqli("localhost","root","root","sunyang");?//實例化mysqli ????$query?=?"select?emp_name?from?employee?;"; ????$query?.=?"select?dep_name?from?depment?"; ????if?($mysqli->multi_query($query))?{?//執行多個查詢 ????????do?{ ????????????if?($result?=?$mysqli->store_result())?{ ????????????????while?($row?=?$result->fetch_row())?{ ????????????????????echo?$row[0]; ????????????????????echo?"
"; ????????????????} ????????????????$result->close(); ????????????} ????????????if?($mysqli->more_results())?{ ????????????????echo?("-----------------
");?//連個查詢之間的分割線 ????????????} ????????}?while?($mysqli->next_result()); ????} ????$mysqli->close();//關閉連接 ?>
在上述代碼中,store_result()方法用于獲得一個緩沖結果集; fetch_row()方法的作用類似于fetch_array()方法;more_results()方法用于從一個多查詢中檢查是否還有更多的查詢結果;next_result()方法用于從一個多查詢中準備下一個查詢結果。
6、事務操作
首先只有數據庫中表的類型為InnoDB時,才支持事務提交,建議使用InnoDB,更建議使用mysqli擴展庫了,不僅因為mysqli支持多條sql查詢,更是因為它的速度、性能、安全更可靠,而且完全面向對象,當然也可以是面向過程操作。
看下面mysqli對事務操作的php代碼:
query("set?names?utf8"); ????if?($mysqli->connect_error){ ????????die("連接錯誤:".$mysqli->connect_error); ????} ????//將事務提交設為false ????$mysqli->autocommit(false); ????$sql?=?"insert?into?`user`?values(null,'小紅',md5(123),'321321')"; ????$sql2?=?"insert?into?`user`?values(null,'小王',md5(321),'dasf')"; ????//執行操作,返回的是bool值 ????$query?=?$mysqli->query($sql); ????$query2?=?$mysqli->query($sql2); ? ????if?($query?&&?$query2){ ????????$mysqli->commit(); ????????echo?"操作成功"; ????}else{ ????????echo?"操作失敗".$mysqli->error; ????????$mysqli->rollback(); ????} ????$mysqli->autocommit(true); ????$mysqli->close(); ?>