Maison > Article > développement back-end > PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译),mysqli面向对象_PHP教程
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 else 39 { 40 if($this->mysqli->affected_rows>0) 41 { 42 echo "操作成功!"; 43 } 44 else 45 { 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'),'sd@sohu.com',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 //将提交设为false 14 $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 else 29 { 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='ssd@qq.com'; 21 $age='1'; 22 23 #4、参数赋值(第一个参数指代参数的类型缩写,string-s,int-i,double-d,bool-b 24 $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 else 38 { 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-b 22 $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){} 取出每一个数据