PHP自5.5起,已經(jīng)完全廢除mysql擴(kuò)展,官方推薦使用MySQLI或PDO來代替。這篇文章主要講mysqli的一些基本操作。使用mysqli有兩個(gè)風(fēng)格的寫法,對(duì)象式或函數(shù)式,下面我們只展示函數(shù)式的寫法風(fēng)格。
數(shù)據(jù)庫(kù)連接
首先肯定需要連接數(shù)據(jù)庫(kù)。連接數(shù)據(jù)前,我們需要準(zhǔn)備的一般有數(shù)據(jù)庫(kù)的賬號(hào)、密碼、端口號(hào)、數(shù)據(jù)庫(kù)名。
因?yàn)榫W(wǎng)絡(luò)原因或其他原因經(jīng)常會(huì)有連接不上數(shù)據(jù)庫(kù)的情況,所以,我們需要做連接失敗的處理。
<?php // 數(shù)據(jù)庫(kù)連接 $mysqli = mysqli_connect( 'localhost', 'root', '', 'test' ); if (mysqli_connect_errno()) { throw new Exception('databases connect error:' .mysqli_connect_error()); } // ...一些數(shù)據(jù)庫(kù)操作 // 關(guān)閉數(shù)據(jù)庫(kù)資源 mysqli_close($mysqli);
設(shè)置字符集
設(shè)置字符集使用mysqli_set_charset();
字符集目前我們大都使用utf8mb4,因?yàn)樗С?個(gè)字節(jié)長(zhǎng)度的字符。他支持一些emoji表情字符。當(dāng)然如果你不需要支持4字節(jié)字符的話可以選擇使用utf8,因?yàn)樗容^??臻g。
mysqli_set_chartset($mysqli, 'utf8mb4');
重新選擇數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)連接后,還可以重新選擇數(shù)據(jù)庫(kù)。
mysqli_select_db($mysqli, '數(shù)據(jù)庫(kù)名');
CURD操作
mysqli_query():對(duì)數(shù)據(jù)庫(kù)執(zhí)行一次操作,DDL、DQL 、DML都支持。
mysqli_affected_rows():獲取影響記錄行數(shù)。
新增數(shù)據(jù)操作
mysqli_query($mysqli, "INSERT INTO users(username, age, sex) VALUES('周杰倫', 35, '男'), ('謝霆鋒', 35, '男')" ); if (mysqli_affected_rows($mysqli) <= 0) { throw new Exception('databases insert error:' . mysqli_error($mysqli)); }
修改數(shù)據(jù)操作
這里面有一個(gè)注意點(diǎn),mysqli_affected_rows返回的值為0的情況。它更新的信息與上次完全一樣,這個(gè)情況很普遍。比如說在修改的時(shí)候,連續(xù)點(diǎn)擊了多次修改按鈕。但并不能說明程序代碼有問題。所以,和新增不一樣的是,返回0也應(yīng)該是成功狀態(tài)。
mysqli_query($mysqli, "UPDATE users SET age=40 WHERE user_id = 1" ); if (mysqli_affected_rows($mysqli) < 0) { throw new Exception('databases update error:' . mysqli_error($mysqli)); }
刪除數(shù)據(jù)操作
注意:修改和刪除操作必須加where條件,不然將會(huì)修改整個(gè)表的數(shù)據(jù),后果不堪設(shè)想(刪庫(kù)跑路o(╯□╰)o)。
mysqli_query($mysqli, "Delete FROM users WHERE user_id = 100" ); if (mysqli_affected_rows($mysqli) <= 0) { throw new Exception('databases delete error:' . mysqli_error($mysqli)); }
查詢操作
當(dāng)mysqli_query執(zhí)行的是一條查詢語句時(shí),該函數(shù)會(huì)返回mysqli_result結(jié)果集。
mysqli_fetch_all()從結(jié)果集中獲取全部數(shù)據(jù)。該函數(shù)第二個(gè)參數(shù)可以指定返回?cái)?shù)據(jù)的格式。分別為:
-
MYSQLI_NUM:返回索引數(shù)組
-
MYSQLI_ASSOC:返回關(guān)聯(lián)數(shù)組
-
MYSQLI_BOTH:既有索引數(shù)組也有關(guān)聯(lián)數(shù)組
另外需要注意,對(duì)結(jié)果集的操作結(jié)束后,記得銷毀結(jié)果集資源。
// 數(shù)據(jù)庫(kù)連接 $mysqli = mysqli_connect( 'localhost', 'root', '', 'test' ); if (mysqli_connect_errno()) { throw new Exception('databases connect error:' .mysqli_connect_error()); } mysqli_set_charset($mysqli, 'utf8mb4'); $result = mysqli_query($mysqli, "SELECT * FROM users" ); if (mysqli_affected_rows($mysqli) < 0) { throw new Exception('databases select error:' . mysqli_error($mysqli)); } $users = mysqli_fetch_all($result, MYSQLI_ASSOC); // 銷毀結(jié)果集資源 mysqli_free_result($result); // 關(guān)閉數(shù)據(jù)庫(kù)資源 mysqli_close($mysqli);