Duang~MySQLi 擴展庫來襲

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語句查詢來說:

  1. multi_query()逐條執行SQL語句,當其中有一條語句執行失敗,後面的語句不會繼續執行;
  2. 如果第一條語句執行成功,無論後面有幾條語句執行失敗,返回值都爲true;
  3. 當第一條語句執行失敗,後面的語句不會執行(與1說明情況相同),返回值爲false;
  4. 注意拼寫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語句查詢來說:

  1. 如果是查詢操作,可以對執行多個查詢語句,並將所有結果集存儲在mysqli對象中,返回true或者false
  2. 使用 use_result() 或 story_result() 獲得 multi_query() 查詢後的一個結果集;
  3. more_result() 檢測是否還有更多的結果集,有返回真;
  4. 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/>';
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章