PHP的 mysqli 擴展提供了其先行版本的全部功能,此外,因爲 MySQL 已是一個php
具備完整特性的數據庫服務器 , 這爲PHP 又添加了一些新特性 。 而 mysqli 偏偏也支持了mysql
這些新特性。sql
一. 創建和斷開鏈接數據庫
與 MySQL數據庫交互時,首先要創建鏈接,最後要斷開鏈接,這包括與服務器鏈接並數組
選擇一個數據庫 , 以及最後關閉鏈接 。與 mysqli 幾乎全部的特性同樣 , 這一點可使用面向瀏覽器
對象的方法來完成,也能夠採用過程化的方式完成。服務器
1. 建立一個 mysqli 的對象函數
$_mysqli = newmysqli();fetch
2. 鏈接 MySQL的主機、用戶、密碼、數據庫編碼
$_mysqli->connect( 'localhost' , 'root' , 'yangfan' , 'guest' );
3. 建立帶鏈接參數的 mysqli對象
$_mysqli = newmysqli( 'localhost' , 'root' , 'yangfan' , 'guest' );
4. 單獨選擇數據庫
$_mysqli->select_db( 'testguest' );
5. 斷開 MySQL
$_mysqli->close();
二. 處理鏈接錯誤
若是沒法鏈接 MySQL數據庫,那麼這個頁面不太可能繼續完成預期的工做。所以,一
定要注意監視鏈接錯誤並相應地作出反應 。Mysqli 擴展包含有不少特性能夠用來捕獲錯誤信
息,例如:mysqli_connect_errno() 和 mysqli_connect_error() 方法。
mysqli_connect_errno()函數返回鏈接數據庫返回的錯誤號。
Mysqli_connect_error()函數返回鏈接數據庫返回的錯誤代碼。
if(mysqli_connect_errno()) {
echo' 數據庫鏈接錯誤,錯誤信息: ' .mysqli_connect_error();
exit();
}
errno屬性返回數據庫操做時的錯誤號。
error屬性返回數據庫操做時的錯誤代碼。
if( $_mysqli ->errno) {
echo' 數據庫操做時發生錯誤,錯誤代碼是: ' . $_mysqli ->error;
}
三. 與數據庫進行交互
絕大多數查詢都與建立(Creation) 、獲取 (Retrieval) 、更新 (Update) 和刪除 (Deletion) 任
務有關,這些任務統稱爲 CRUD 。
1. 獲取數據
網頁程序大多數工做都是在獲取和格式化所請求的數據。爲此,要向數據庫發送
SELECT查詢,再對結果進行迭代處理,將各行輸出給瀏覽器,並按照本身的要求輸出。
// 設置一下編碼 utf8
$_mysqli->set_charset( "utf8" );
// 建立一句 SQL 語句
$_sql = "SELECT* FROM t g_user" ;
// 執行 sql 語句把結果集賦給$_result
$_result = $_mysqli->query( $_sql );
// 將結果集的第一行輸出
print_r( $_result->fetch_row());
// 釋放查詢內存 ( 銷燬 )
$_result->free();
2. 解析查詢結果
一旦執行了查詢並準備好結果集 ,下面就能夠解析獲取到的結果行了 。 你可使用多個
方法來獲取各行中的字段 ,具體選擇哪個方法主要取決於我的喜愛 , 由於只是引用字段的
方法有所不一樣。
將結果集放到對象中
因爲你可能會使用 mysqli的面向對象的語法 , 因此徹底能夠採用面向對象的方式管理結
果集。可使用fetch_object() 方法來完成。
// 將結果集包裝成對象
$_row = $_reslut->fetch_object();
// 輸出對象中的一個字段(屬性)
echo $_row->tg_username;
// 遍歷全部的用戶名稱
while (!! $_row =$_reslut ->fetch_object()) {
echo$_row ->tg_username. ' <br /> ' ;
}
使用索引數組和關聯數組
// 將結果集包裝成數組 ( 索引 +關聯 )
$_row = $_reslut->fetch_array();
// 輸出下標是 3 的字段(屬性)
echo $_row [ 3 ];
// 將結果集包裝成索引數組
$_row = $_reslut->fetch_row();
echo $_row [ 3 ];
// 將結果集包裝成關聯數組
$_row = $_reslut->fetch_assoc();
echo $_row ['tg_username' ];
3. 肯定所選擇的行和受影響的行
一般但願可以肯定 SELECT查詢返回的行數 , 或者受 INSERT 、 UPDATE 或 DELET 查詢
影響的行數。咱們可使用num_rows 和 affected_rows 兩個屬性
// 當使用查詢時,想了解 SELECT查詢了多少行,可使用 num_rows 。
echo $_reslut->num_rows;
// 當使用查詢時 , 想了解SELECT 、 INSERT 、 UPDATE 、 DELETE 查詢時影響的行
數,可使用affected_rows; 注意,它是 $_mysqli 下的屬性
echo $_mysqli->affected_rows;
4. 移動指針的操做和獲取字段
當你並不想從第一條數據開始獲取 ,或者並不想從第一個字段獲取 , 你可使用數據指
針移動或者字段指針移動的方式調整到恰當的位置。 固然 , 你還能夠獲取字段的名稱及其相
關的屬性。
// 計算有多少條字段
echo $_reslut->field_count;
// 獲取字段的名稱
$_field = $_reslut->fetch_field();
echo $_field->name;
// 遍歷字段
while (!! $_field =$_reslut ->fetch_field()) {
echo$_field ->name. '<br />' ;
}
// 一次性取得字段數組
print_r( $_reslut->fetch_fields());
// 移動數據指針
$_reslut->data_seek( 5 );
// 移動字段指針
$_reslut->field_seek( 2 );
5. 執行多條 SQL 語句
有的時候 ,咱們須要在一張頁面上同時執行多條 SQL 語句 , 以前的方法就是分別建立多
個結果集而後使用。但這樣資源消耗很大,也不利於管理。PHP 提供了執行多條 SQL 語句
的方法 $_mysqli->multi_query() ;
// 建立多條 SQL 語句
$_sql .="SELECT * FROM tg_user;" ;
$_sql .="SELECT * FROM tg_photo;" ;
$_sql .="SELECT * FROM tg_article" ;
// 開始執行多條 SQL 語句
if ( $_mysqli->multi_query( $_sql )) {
//開始獲取第一條 SQL 語句的結果集
$_result= $_mysqli ->store_result();
print_r($_result ->fetch_array());
//將結果集指針移到下一個
$_mysqli->next_result();
$_result= $_mysqli ->store_result();
print_r($_result ->fetch_array());
$_mysqli->next_result();
$_result= $_mysqli ->store_result();
print_r($_result ->fetch_array());
} else {
echo'sql 語句有誤! ' ;
}
6. 執行數據庫事務
事務 (transaction)是做爲整個一個單元的一組有序的數據庫操做 。 若是一組中的全部操
做都成功 , 則認爲事務成功 ,即便只有一個失敗操做 , 事務也不成功 。 若是全部操做成功完
成 , 事務則提交 (commit) ,其修改將做用於全部其餘數據庫進程 。 若是一個操做失敗 , 則事
務將回滾 (roll back),該事務全部操做的影響都將取消。
首先 , 您的 MySQL 是InnoDB 或 BDB 引擎的一種 , 通常來講 , 你安裝了 AppServ 的集成
包 , 你選擇 InnoDB的引擎的數據庫便可 。 若是你創建的表不是 InnoDB , 能夠在 phpmyadmin
裏修改。
// 首先你必須關閉自動提交數據
$_mysqli->autocommit( false );
// 建立一個 SQL 語句,必須同時運行成功,不能出現一個成功,一個失敗
$_sql .="UPDATE tg_friend SET tg_state=tg_state+5 WHERE tg_id=1;" ;
$_sql .="UPDATE tg_flower SET tg_flower=tg_flower-5 WHERE tg_id=1;" ;
// 執行兩條 SQL 語句
if ( $_mysqli->multi_query( $_sql )) {
//獲取第一條 SQL 一影響的行數
$_success= $_mysqli ->affected_rows == 1 ? true : false ;
//下移,第二條 SQL
$_mysqli->next_result();
//獲取第二條 SQL 影響的行數
$_success2 = $_mysqli ->affected_rows == 1 ? true : false ;
//判斷是否都正常經過了,兩個 SQL
if( $_success && $_success2 ) {
$_mysqli->commit();
echo' 完美提交! ' ;
}else {
$_mysqli->rollback();
echo' 程序出現異常! ' ;
}
}
} else {
echo"SQL 語句有誤: " . $_mysqli ->errno. $_mysqli ->error;
}
// 最後還必須開啓自動提交
$_mysqli->autocommit( true );