這篇文章主要介紹了關於php操作MySQL資料庫之MySQLI方式,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
PHP操作MySQL的三種方式
MySQL
非永久串連,每次使用資料庫,都會開啟一個新進程,
缺點:
效能較低,PHP5.0以後被廢棄。
MySQLi
永久串連,減輕伺服器壓力,只支援MySQL
缺點:
佔用記憶體
PDO (推薦使用)
能實現MySQLi的常用功能,支援大部分資料庫。
MySQLI方式(物件導向)
基本使用:
1)串連資料庫
$mysqli = new mysqli(‘host’,‘username’,‘password’,‘database’)
2)執行SQL語句
$mysqli -> query($sql);
3)擷取結果
$result -> fetch_array([MYSQLI_ASSOC]) 一個$result -> fetch_assoc() 一個$result -> fetch_all([MYSQLI_ASSOC]) 全部
方法一預設是索引數組,添加參數後變成關聯陣列。
方法二,相當於方法一加參數。
4)關閉串連
$mysqli -> close();
執行個體:
<?php// MySQLi增刪改例子// MySQLi方式串連資料庫$mysqli = new mysqli('localhost','root','123456789','test');// 執行SQL語句// 使用utf-8編碼$mysqli -> query('set names utf8');// 插入//$result = $mysqli -> query("INSERT users(name,money) VALUES('甜筒',4) ");//$result = $mysqli -> query("INSERT users(name,money) VALUES('麥辣雞腿堡',16) ");// 修改//$result = $mysqli -> query("UPDATE users SET `name`= '麥旋風' WHERE `id` = 2");// 刪除//$result = $mysqli -> query("DELETE FROM users WHERE `id` = 5");//var_dump($result);/*********************查詢*****************/ $result = $mysqli -> query("SELECT * FROM users");// 擷取結果集$data = $result -> fetch_all(MYSQLI_ASSOC);var_dump($data);
事務控制
事務就是將多個邏輯工作,組合成一個執行單元的資料庫操作(共成敗)。
1)開啟事務
$mysqli -> autocommit(false)
這個方法將會讓事務馬上提交,所以需要填參數false。
2)交易回復
$mysqli -> rollback()
如果資料出現了什麼差錯,可以使用這個方法還原資料。
3)事務提交
$mysqli -> commit()
4)關閉串連
$mysqli -> close()
注意:
當我們使用query()執行SQL語句的時候,他不會管資料庫的變化,只管SQL語句是否錯誤。
所以我們不能依賴query()的傳回值,來判斷操作成功與否。
要使用影響行數,來判斷:
$mysqli -> affected_rows
執行個體
<?php// MySQLi事務控制例子header("content-type:text/html;charset=utf-8");// MySQLi方式串連資料庫$mysqli = new mysqli('localhost','root','123456789','test');// 使用utf-8編碼$mysqli -> query('set names utf8');// 開啟事務$mysqli -> autocommit(false);//SQL$sql1 = "UPDATE users SET `money`=`money`+1 WHERE `id` = 1";$sql2 = "UPDATE users SET `money`=`money`-1 WHERE `id` = 11";// 執行SQL語句$result = $mysqli -> query($sql1);$r1 = $mysqli -> affected_rows;$result = $mysqli -> query($sql2);$r2 = $mysqli -> affected_rows;if($r1 > 0 && $r2 > 0){ // 提交事務 $mysqli -> commit(); echo '操作成功';}else{ // 交易回復 $mysqli -> rollback(); echo '操作失敗';}
預先處理
預先處理,先提交SQL語句到服務端,執行先行編譯。
用戶端執行SQL語句時,只需要上傳輸入參數即可;
若涉及多次讀取或儲存,效率高於普通SQL執行操作。
1)$sql = “???”
SQL語句的VALUE裡面的參數,使用問號代替。
2)建立先行編譯對象
$stmt = $mysqli -> prepare($sql)
3)參數賦值
$stmt -> bind_param('參數類型', 參數1, 參數2...)
參數類型說明:
string-s int-i double-d bool-b
特別提醒:
參數類型按照順序寫,不用空格、逗號,如參數1為string,參數2為bool,寫成這樣:
$stmt -> bind_param('si', 參數1, 參數2)
4)變數綁定結果集(查詢才需要這一步,其它操作跳過這步)
$stmt -> bind_result()
特別注意:
bind_result的變數對應select語句裡的欄位名,所以數量、順序千萬要注意!!!
5)執行代碼
$stmt -> execute()
6)查詢記錄存進PHP程式(查詢操作 可選)
$stmt->store_result()
詳細請看下面的連結
詳細解析
7)擷取每條記錄的結果
$stmt ->fetch()
執行個體
<?php// MySQLi預先處理(查詢) 例子header("content-type:text/html;charset=utf-8");// MySQLi方式串連資料庫$mysqli = new mysqli('localhost','root','123456789','test');// 使用utf-8編碼$mysqli -> query('set names utf8');// SQL語句$sql = "SELECT * FROM users WHERE id>? ";// 建立先行編譯對象$stmt = $mysqli -> prepare($sql);// 參數綁定$id = 1;$stmt -> bind_param('i',$id);// 綁定結果集 參數要和表的參數一致$stmt -> bind_result($id,$name,$money,$age);// 執行SQL語句$stmt -> execute();// 執行SQL語句$stmt->store_result();// 接收結果集while($stmt -> fetch()){ $data[] = [ 'id' => $id, 'name' => $name, 'money' => $money ];}var_dump($data);