mysqli操作數據庫
一. 建立和斷開連接
與MySQL數據庫交互時,首先要建立連接,最後要斷開連接,這包括與服務器連接並
選擇一個數據庫,以及最後關閉連接。與mysqli幾乎所有的特性一樣,這一點可以使用面向
對象的方法來完成,也可以采用過程化的方式完成。
1.創建一個mysqli的對象
$_mysqli = new mysqli();
2.連接MySQL的主機、用戶、密碼、數據庫
$_mysqli->connect(‘localhost‘,‘root‘,‘yangfan‘,‘guest‘);
3.創建帶連接參數的mysqli對象
$_mysqli = new mysqli(‘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 tg_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);
mysqli操作數據庫