標籤:
1、和mysql擴充庫的區別:
(1 安全性、穩定性更高
(2 提供了物件導向和面向過程兩種風格
2、php.ini 中的 extension=php_mysqli.dll 解除封印
3、物件導向:查詢列表
1 <?php 2 3 //mysqli 操作資料(物件導向風格) 4 5 #1、建立Mysql對象 6 7 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); 8 if(!$mysqli) 9 {10 die("串連失敗!".$mysqli->connect_error);11 }12 13 #2、操作資料庫14 15 $sql="select * from user1";16 $res=$mysqli->query($sql);17 #3、處理結果18 19 while($row=$res->fetch_row())20 {21 foreach($row as $key=> $val)22 {23 echo "-- $val";24 }25 echo "<br/>";26 }27 #4、關閉資源28 $res->free();//釋放記憶體29 $mysqli->close();//關閉串連30 31 ?>
4、物件導向:封裝類後實現
4.1 Sqliconnect.class.php
1 <?php 2 3 Class Sqliconnect 4 { 5 private $mysqli; 6 private static $host="127.0.0.1"; 7 private static $root="root"; 8 private static $password="daomul"; 9 private static $db="test";10 11 function __construct()12 {13 $this->mysqli=new MySQLi(self::$host,self::$root,self::$password,self::$db);14 if(!$this->mysqli)15 {16 die("資料庫連接失敗!".$this->mysqli->connect_error);17 }18 19 $this->mysqli->query("set names utf8");20 }21 22 //查詢操作23 public function excute_dql($sql)24 {25 $res=$this->mysqli->query($sql) or die("資料查詢失敗".$this->mysqli->error);26 return $res;27 28 }29 30 //增刪改操作31 public function excute_dml($sql)32 {33 $res=$this->mysqli->query($sql) or die("資料操作失敗".$this->mysqli->error);34 if(!$res)35 {36 echo "資料操作失敗";37 }38 else39 {40 if($this->mysqli->affected_rows>0)41 {42 echo "操作成功!";43 }44 else45 {46 echo "0行資料受影響!";47 }48 }49 }50 51 }52 ?>
4.2 調用頁面startsqli.php
1 <?php 2 3 //mysqli 操作資料(物件導向風格) 4 5 6 require_once "Sqliconnect.class.php"; 7 8 $Sqliconnect=new Sqliconnect(); 9 10 //$sql="insert into user1(name,password,email,age) values(‘帝都‘,md5(‘gg‘),‘[email protected]‘,23)";11 //$sql="delete from user1 where id=11";12 //$res=$Sqliconnect->excute_dml($sql);13 14 $sql="select name from user1;";15 $res=$Sqliconnect->excute_dql($sql);16 while($row=$)17 18 $res->free();19 ?>
5、同時執行多條資料庫語句 multiQuery.php
1 <?php 2 3 //mysqli 操作資料(物件導向風格) 4 5 #1、建立Mysql對象 6 7 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); 8 if(!$mysqli) 9 {10 die("串連失敗!".$mysqli->connect_error);11 }12 13 #2、操作資料庫14 15 $sqls="select * from user1;";16 $sqls.="select * from user1";17 18 #3、處理結果19 20 if($res=$mysqli->multi_query($sqls))21 {22 echo "211";23 do 24 {25 //從mysqli連續取出第一個結果集26 $result=$mysqli->store_result();27 28 //顯示mysqli result對象29 while($row=$result->fetch_row())30 {31 foreach($row as $key=> $val)32 {33 echo "-- $val";34 }35 echo "<br/>";36 }37 38 $result->free();//及時釋放當前結果集,並進入下一結果集39 40 //判斷是否有下一個結果集41 if(!$mysqli->more_results())42 {43 break;44 }45 echo "<br/>************新的結果集**************";46 47 }while($mysqli->next_result());48 }49 50 #4、關閉資源51 $mysqli->close();//關閉串連 52 53 54 ?>
6、事務控制
1 <?php 2 3 //mysqli 操作資料(物件導向風格) 4 5 6 // 資料庫 :create table account(id int primary key,balance float); 7 8 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); 9 if(!$mysqli)10 {11 die("資料庫連接失敗!".$mysqli->connect_error);12 }13 //將提交設為false14 $mysqli->autocommit(false);15 16 $sql1="update account set balance=balance+1 where id=1;";//沒錯的語句17 $sql2="update accounterror2 set balance=balance-1 where id=2";//有錯的語句18 19 $res1=$mysqli->query($sql1);20 $res2=$mysqli->query($sql2);21 22 if(!$res1||!$res2)23 {24 //復原:其中一個不成功即復原不提交25 echo "有錯,復原,請重新提交!";26 $mysqli->rollback();//die("操作失敗!".$mysqli->error);27 }28 else29 {30 //所有均成功則提交31 echo "所有提交成功!";32 $mysqli->commit();33 }34 35 $mysqli->close();36 /* 37 1、 start transaction; 開啟事務38 2、svaepoint a; 做儲存點39 3、執行操作1; 40 4、 svaepoint b;41 5、執行操作2;42 ...43 6、rollback to a/b; 復原或者是提交44 7、commit 45 46 事務控制特點acid 原子性/一致性/隔離性/持久性47 */48 ?>
7、預先處理技術
主要在串連和編譯過程精簡,還可以SQL防止注入
7.1 先行編譯插入多個資料
1 <?php 2 3 //mysqli 先行編譯示範 4 5 #1、建立mysqli對象 6 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); 7 if(!$mysqli) 8 { 9 die("資料庫連接失敗!".$mysqli->connect_error);10 }11 12 #2、建立先行編譯對象13 $sql="insert into user1(name,password,email,age) values(?,?,?,?);";//暫時不賦值,用問號代替14 $stmt=$mysqli->prepare($sql) or die($mysqli->error);15 16 /********************************可重複執行時需要的代碼start*********************************/17 #3、綁定參數18 $name=‘小明5‘;19 $password=‘34f‘;20 $email=‘[email protected]‘;21 $age=‘1‘;22 23 #4、參數賦值(第一個參數指代參數的類型縮寫,string-s,int-i,double-d,bool-b24 $stmt->bind_param("sssi",$name,$password,$email,$age);25 26 #5、執行代碼(返回布爾類型)27 $flag=$stmt->execute();28 29 /********************************可重複執行時需要的代碼 end************************************/30 31 #6、結果以及釋放32 33 if(!$flag)34 {35 die("操作失敗".$stmt->error);36 }37 else38 {39 echo "操作成功!";40 }41 42 $mysqli->close();43 44 45 ?>
7.2 先行編譯查詢多個資料
1 <?php 2 3 //mysqli 先行編譯示範 4 5 #1、建立mysqli對象 6 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); 7 if(!$mysqli) 8 { 9 die("資料庫連接失敗!".$mysqli->connect_error);10 }11 12 /********************************可重複執行時需要的代碼 start*******************************/13 14 #2、建立先行編譯對象15 $sql="select id,name,email from user1 where id>?;";//id,name,email和後面的結果集bind_result()對應16 $stmt=$mysqli->prepare($sql) or die($mysqli->error);17 18 #3、綁定參數19 $id=5;20 21 #4、參數賦值(第一個參數指代參數的類型縮寫,string-s,int-i,double-d,bool-b22 $stmt->bind_param("i",$id);//綁定參數23 $stmt->bind_result($id,$name,$email);//綁定結果集24 25 #5、執行代碼(返回布爾類型)26 $stmt->execute();27 28 #6、取出結果集顯示29 while($stmt->fetch())30 {31 echo "<br/>$id--$name--$email";32 }33 34 /********************************可重複執行時需要的代碼 end*******************************/35 36 #7、結果以及釋放37 38 //釋放結果39 $stmt->free_result();40 //關閉先行編譯語句41 $stmt->close();42 //關閉資料庫連接43 $mysqli->close();44 45 46 ?>
8、其他函數
(1 擷取行數和列數 num_rows field_count
(2 擷取結果集的一列 :表頭 例如
$result=$mysqli->query();
$result->fetch_field();
(3 取出資料
$row=$result->fetch_row(); //獲得每一行資料
再通過 foreach($row as $val){} 取出每一個資料
PHP mysqli 擴充庫(物件導向/資料庫操作封裝/事務控制/先行編譯)