php數據庫擴展mysqli詳細使用教程

mysqli提供了面向對象和面向過程兩種方式來與數據庫交互,分別看一下這兩種方式。

相關mysql視頻教程推薦:《mysql教程

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); ?&gt;

關閉與MySQL服務器的連接通過mysqli對象調用close()方法即可,例如:

$mysqli-&gt;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-&gt;close(); ?>

在上面代碼中,num_rows為結果集的一個屬性,返回結果集中行的數目。方法fetch_array()將結果集中的記錄放入一個數組中并將其返回。最后使用free()方法將結果集中的內存釋放,使用close()方法將數據庫連接關閉。

對于刪除記錄(delete)、保存記錄(insert)和修改記錄(update)的操作,也是使用query()方法來執行的,下面是刪除記錄的例子:

query($query); ????if?($result){ ????????echo?"刪除操作執行成功"; ????}else?{ ????????echo?"刪除操作執行失敗"; ????} ????$mysqli-&gt;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-&gt;close();?//關閉連接 ?>

在綁定結果的時候,腳本中的變量要與結果集中的字段一一對應,綁定完以后,通過fetch()方法將綁定在結果集中的變量一一取出來,最后將預處理和數據庫連接分別關閉。

(2)綁定參數

所謂綁定參數就是把PHP腳本中的自定義變量綁定到SQL語句中的參數(參數使用 “?”代替)上,綁定參數使用bind_param()方法,該方法的語法格式如下:

bool?bind_param?(?string?$types?,?mixed?&amp;$var1?[,?mixed?&amp;$...?]?)

在上述語法中涉及到的參數說明如下。

types:綁定的變量的數據類型,它接受的字符種類包括4個,如下表所示(參數types接受的字符的種類和綁定的變量需要一一對應)。

php數據庫擴展mysqli詳細使用教程

var1:綁定的變量,其數量必須要與SQL語句中的參數數量保持一致。

綁定參數的示例代碼如下:

prepare($query); ????$result->bind_param("ssi",$number,$name,$age);?//綁定參數 ????$number='sy0807'; ????$name='employee7'; ????$age=20; ????$result->execute();?//執行預準備語句 ????$result->close(); ????$mysqli-&gt;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-&gt;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-&gt;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-&gt;close(); ?>

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享