PHP-MySQL 函數庫是 PHP 操作 MySQL 資料庫最原始的擴展庫,PHP-MySQLi 的 i 代表 Improvement ,相當於前者的增強版,也包含了相對進階的功能,另外本身也增加了安全性,比如可以大幅度減少 SQL 注入等問題的發生。
開啓擴展
mysqli 擴展默認並不會開啓,爲此我們需要找到 php.ini 文件,並且需要確認刪除了 [PHP_MYSQLI] 部分中的 extension=php_mysqli.dll 行首的註釋符號 ;(分號)。
檢驗是否開啓成功的幾種方式
#1 通過 PHPInfo()函數
phpinfo();
#2 通過extension_loaded() 函數檢測
var_dump(extension_loaded('mysqli'));
#3 通過 (function_exists()檢測函數是否存在
var_dump(function_exists('mysqli_connect'));
#4 通過get_loaded_extensions() 函數得到當前已經開啓的擴展
print_r(get_loaded_extensions());
連接數據庫
連接並選擇 mysql 數據庫的幾種方式:
#1 建立到MySQL數據的連接並選擇數據庫
$mysqli=new mysqli('localhost','root','root');
$mysqli->select_db('test');
#2 實例化mysqli對象之後實現連接
$mysqli=new mysqli();
$mysqli->connect('127.0.0.1','root','root');
#3 建立連接的同時打開指定數據庫(常用)
$mysqli=@new mysqli('localhost','root','root','test');
#4 檢測是否連接成功
if ($mysqli->connect_errno) {
die("數據庫連接失敗,錯誤信息:".$mysqli->connect_error);
}
$mysqli->connect_errno:得到連接產生的錯誤編號 ,$mysqli->connect_error:得到連接產生的錯誤信息
設置編碼格式及獲取基本信息
#1 通過函數設置
$mysqli->set_charset('utf8');
#2 通過查詢設置
$mysqli->query("set names utf8")
# 獲取當前字符集
echo $mysqli->character_set_name()."<br>";
# 獲取客戶端信息
echo $mysqli->get_client_info()."<br>";
# 獲取mysql主機信息
echo $mysqli->host_info."<br>";
# 獲取服務器信息
echo $mysqli->server_info."<br>";
# 獲取服務器版本
echo $mysqli->server_version."<br>";
CURD之新增
#1 編寫 SQL 語句:
$sql="INSERT user(username,password) VALUES ('queen1','queen1'),('queen2','queen2')";
#2 使用query方法查詢
$res = $mysqli->query($sql);
#3 查詢成功可利用 insert_id 屬性得到上一插入操作產生的AUTO_INCREMENT的值
echo '恭喜您註冊成功,您是網站第'.$mysqli->insert_id.'位用戶<br/>';
#4 查詢失敗可利用 errno(錯誤編號)及error(錯誤信息)進行提示:
echo 'ERROR '.$mysqli->errno.':'.$mysqli->error;
CURD之修改
#1 同樣編寫 SQL 語句:
$sql="UPDATE user SET age = age + 10";
#2 使用query方法查詢
$res=$mysqli->query($sql);
#3 可利用 affected_rows 屬性查詢受影響數目
echo $mysqli->affected_rows.'條記錄被更新';
#4 查詢失敗可利用 errno(錯誤編號)及error(錯誤信息)進行提示:
echo 'ERROR '.$mysqli->errno.':'.$mysqli->error;
CURD之刪除
#1 編寫 SQL 語句
$sql="DELETE FROM user WHERE id<=6";
#2 使用query方法查詢
$res=$mysqli->query($sql);
注意:上面增刪改查詢返回結果均爲 bool 類型,且均可使用 affected_rows 屬性查看受影響條數,其返回值有三種情況: 受影響的記錄條數 、SQL語句有問題則返回 -1,沒有受影響記錄的條數則返回 0
CURD之查詢
#1 編寫 SQL 語句
$sql="SELECT id,username,age FROM user";
#2 使用query方法查詢
$mysqli_result = $mysqli->query($sql);
查詢成功返回 mysqli_result 類,查詢失敗返回 FALSE,我們可以根據 mysqli_result 類提供幾種的方法獲取數據;
#3.1 使用 fetch_all() 方法獲取結果集中的全部記錄,默認放回的是索引格式的二維數組;
$rows = $mysqli_result->fetch_all(MYSQLI_BOTH);
通過參數改變其返回值的類型:MYSQLI_NUM(索引)、MYSQLI_ASSOC(關聯)、MYSQLI_BOTH(兩者)
#3.2 使用 fetch_array() 方法返回結果集中第一條數據,並且沒執行一次該方法,數組指針下移一位,如果後面沒有數據則返回NULL,所以利用此特性使用循環同樣能實現獲取全部數據
while($row = $mysqli_result->fetch_array()){
$rows[]=$row;
}
# 使用 fetch_assoc() 方法或者 fetch_row() 方法可以獲得與 fetch_array()方法同樣的效果,也就說是
fetch_array(MYSQLI_ASSOC) === fetch_assoc();
fetch_array(MYSQLI_NUM) === fetch_row();
#4 查詢結束之後,需要釋放結果集
$mysqli_result->free();
#5 關閉數據庫
$mysqli->close();
多語句查詢 - 針對 增、刪、改
PHP 實現對 MySQL 多條語句查詢—–同時執行 INSERT INTO 、DELETE 、UPDATE 語句:
#1 拼接語句
$sql = "INSERT user(username,password,age) VALUES('atong','atong',18);";
$sql .= "UPDATE user SET age=18 WHERE id=1;";
$sql .= "DELETE FROM user WHERE id=5;";
#2 使用 multi_query() 代替 query() 進行查詢
$res = $mysqli->multi_query($sql);
針對 增、刪、改的多條SQL語句查詢來說:
- multi_query()逐條執行SQL語句,當其中有一條語句執行失敗,後面的語句不會繼續執行;
- 如果第一條語句執行成功,無論後面有幾條語句執行失敗,返回值都爲true;
- 當第一條語句執行失敗,後面的語句不會執行(與1說明情況相同),返回值爲false;
- 注意拼寫SQL語句時必須帶上;符
多語句查詢 - SELECT
PHP 實現對 MySQL 多條語句查詢—–同時執行多條 SELECT 語句:
#1 拼接多條 SQL 語句:
$sql = "SELECT * FROM user WHERE id = 1;";
$sql .= "SELECT CURRENT_USER();";
$sql .= "SELECT NOW();";
#2 查詢並返回結果
$bool = $mysqli->multi_query($sql);
#3 使用 use_result() 或 store_result() 獲取第一條查詢產生的結果集
$mysqli_result=$mysqli->store_result()
#4 將結果集數組存儲爲二維數組格式
$rows[]=$mysqli_result->fetch_all(MYSQLI_ASSOC);
#5 檢測是否有更多的結果集
more_results()
#6 將結果集指針向下移動一位
next_result()
### 重複…3、4、5、6、即使用可使用循環實現,將以上歸納:
if($mysqli->multi_query($sql)){
do{
if($mysqli_result=$mysqli->store_result()){
$rows[]=$mysqli_result->fetch_all(MYSQLI_ASSOC);
}
}while($mysqli->more_results() && $mysqli->next_result());
}else{
echo $mysqli->error;
}
針對 增、刪、改的多條SQL語句查詢來說:
- 如果是查詢操作,可以對執行多個查詢語句,並將所有結果集存儲在mysqli對象中,返回true或者false
- 使用 use_result() 或 story_result() 獲得 multi_query() 查詢後的一個結果集;
- more_result() 檢測是否還有更多的結果集,有返回真;
- next_result() 將結果集指針移動指向下一條結果集,移動成功返回真;
預處理
以查詢操作爲例:
#1 編寫SQL語句(注意使用 ‘?’ 作爲佔位符)
$sql="SELECT id,username,age FROM user WHERE age >= ?";
#2 準備(除了 ? 其它已經不會改變,可防止SQL注入)
$mysqli_stmt=$mysqli->prepare($sql);
#3 綁定參數( s,i,d,s 爲字符串,i爲整型,d爲小數型)
$id = 20;
$mysqli_stmt->bind_param('i',$id);
#4 執行預處理語句(返回值是布爾值)
$bool = $mysqli_stmt->execute()
#5 綁定結果集中的值到變量
$mysqli_stmt->bind_result($id,$username,$age);
#6 遍歷結果集
while($mysqli_stmt->fetch()){
echo '編號:'.$id,'<br/>';
echo '用戶名:'.$username,'<br/>';
echo '年齡:'.$age.'<br/>';
echo '<hr/>';
}
- 預處理語句大大減少了分析時間,值在$mysqli_stmt=$mysqli->prepare($sql);時mysql會分析語句.
- 綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句。
- 預處理語句針對SQL注入是非常有用的,因爲參數值發送後使用不同的協議,保證了數據的合法性。
事務
事務的實現過程是關閉自動提交功能,然後編寫多條查詢語句,然後提交查詢,如果某條語句查詢失敗,那麼將回滾全部的語句,下面通過一個小栗子學習PHP中的事務:
# 創建一數據表
CREATE TABLE `test` (
`id` smallint NOT NULL AUTO_INCREMENT ,
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`money` int NOT NULL ,
PRIMARY KEY (`id`)
);
# 插入測試數據:
INSERT INTO test (`user_name`,`money`) VALUES('atong',100),('king',50);
#1 關閉自動提交功能
$mysqli->autocommit(FALSE); // 開始事務
#2 準備第一條查詢語句
$sql0 = "UPDATE test SET money = money-10 WHERE user_name='atong'";
$res0 = $mysqli->query($sql);
$res_affect0 = $mysqli->affected_rows; //影響數量
#3 準備第二條查詢語句
$sql1 = "UPDATE user_money SET money=money+10 WHERE user_name='king'";
$res1 = $mysqli->query($sql1);
$res1_affect = $mysqli->affected_rows;
#4 判斷查詢結果,如果成功則執行,否則回滾
if($res0 && $res_affect0 > 0 && $res1 && $res1_affect > 0){
//手動提交數據
$mysqli->commit();
echo '轉賬成功<br/>';
//恢復自動提交功能
$mysqli->autocommit(TRUE);
}else{
//事務回滾,任何一條數據都不執行。
$mysqli->rollback();
echo '轉賬失敗<br/>';
}