1、和mysql扩展库的区别:
(1 安全性、稳定性更高
(2 提供了面向对象和面向过程两种风格
2、php.ini 中的 extension=php_mysqli.dll 解除封印
3、面向对象:查询列表
<?php //mysqli 操作数据(面向对象风格) #1、创建Mysql对象 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); if(!$mysqli) { die("连接失败!".$mysqli->connect_error); } #2、操作数据库 $sql="select * from user1"; $res=$mysqli->query($sql); #3、处理结果 while($row=$res->fetch_row()) { foreach($row as $key=> $val) { echo "-- $val"; } echo "<br/>"; } #4、关闭资源 $res->free();//释放内存 $mysqli->close();//关闭连接 ?>
4、面向对象:封装类后实现
4.1 Sqliconnect.class.php
<?php Class Sqliconnect { private $mysqli; private static $host="127.0.0.1"; private static $root="root"; private static $password="daomul"; private static $db="test"; function __construct() { $this->mysqli=new MySQLi(self::$host,self::$root,self::$password,self::$db); if(!$this->mysqli) { die("数据库连接失败!".$this->mysqli->connect_error); } $this->mysqli->query("set names utf8"); } //查询操作 public function excute_dql($sql) { $res=$this->mysqli->query($sql) or die("数据查询失败".$this->mysqli->error); return $res; } //增删改操作 public function excute_dml($sql) { $res=$this->mysqli->query($sql) or die("数据操作失败".$this->mysqli->error); if(!$res) { echo "数据操作失败"; } else { if($this->mysqli->affected_rows>0) { echo "操作成功!"; } else { echo "0行数据受影响!"; } } } } ?>
4.2 调用页面startsqli.php
<?php //mysqli 操作数据(面向对象风格) require_once "Sqliconnect.class.php"; $Sqliconnect=new Sqliconnect(); //$sql="insert into user1(name,password,email,age) values(‘帝都‘,md5(‘gg‘),‘[email protected]‘,23)"; //$sql="delete from user1 where id=11"; //$res=$Sqliconnect->excute_dml($sql); $sql="select name from user1;"; $res=$Sqliconnect->excute_dql($sql); while($row=$) $res->free(); ?>
5、同时执行多条数据库语句 multiQuery.php
<?php //mysqli 操作数据(面向对象风格) #1、创建Mysql对象 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); if(!$mysqli) { die("连接失败!".$mysqli->connect_error); } #2、操作数据库 $sqls="select * from user1;"; $sqls.="select * from user1"; #3、处理结果 if($res=$mysqli->multi_query($sqls)) { echo "211"; do { //从mysqli连续取出第一个结果集 $result=$mysqli->store_result(); //显示mysqli result对象 while($row=$result->fetch_row()) { foreach($row as $key=> $val) { echo "-- $val"; } echo "<br/>"; } $result->free();//及时释放当前结果集,并进入下一结果集 //判断是否有下一个结果集 if(!$mysqli->more_results()) { break; } echo "<br/>************新的结果集**************"; }while($mysqli->next_result()); } #4、关闭资源 $mysqli->close();//关闭连接 ?>
6、事务控制
<?php //mysqli 操作数据(面向对象风格) // 数据库 :create table account(id int primary key,balance float); $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); if(!$mysqli) { die("数据库连接失败!".$mysqli->connect_error); } //将提交设为false $mysqli->autocommit(false); $sql1="update account set balance=balance 1 where id=1;";//没错的语句 $sql2="update accounterror2 set balance=balance-1 where id=2";//有错的语句 $res1=$mysqli->query($sql1); $res2=$mysqli->query($sql2); if(!$res1||!$res2) { //回滚:其中一个不成功即回滚不提交 echo "有错,回滚,请重新提交!"; $mysqli->rollback();//die("操作失败!".$mysqli->error); } else { //所有均成功则提交 echo "所有提交成功!"; $mysqli->commit(); } $mysqli->close(); /* 1、 start transaction; 开启事务 2、svaepoint a; 做保存点 3、执行操作1; 4、 svaepoint b; 5、执行操作2; ... 6、rollback to a/b; 回滚或者是提交 7、commit 事务控制特点acid 原子性/一致性/隔离性/持久性 */ ?>
7、预处理技术
主要在连接和编译过程精简,还可以SQL防止注入
7.1 预编译插入多个数据
<?php //mysqli 预编译演示 #1、创建mysqli对象 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); if(!$mysqli) { die("数据库连接失败!".$mysqli->connect_error); } #2、创建预编译对象 $sql="insert into user1(name,password,email,age) values(?,?,?,?);";//暂时不赋值,用问号代替 $stmt=$mysqli->prepare($sql) or die($mysqli->error); /********************************可重复执行时需要的代码start*********************************/ #3、绑定参数 $name=‘小明5‘; $password=‘34f‘; $email=‘[email protected]‘; $age=‘1‘; #4、参数赋值(第一个参数指代参数的类型缩写,string-s,int-i,double-d,bool-b $stmt->bind_param("sssi",$name,$password,$email,$age); #5、执行代码(返回布尔类型) $flag=$stmt->execute(); /********************************可重复执行时需要的代码 end************************************/ #6、结果以及释放 if(!$flag) { die("操作失败".$stmt->error); } else { echo "操作成功!"; } $mysqli->close(); ?>
7.2 预编译查询多个数据
<?php //mysqli 预编译演示 #1、创建mysqli对象 $mysqli=new MySQLi("127.0.0.1","root","daomul","test"); if(!$mysqli) { die("数据库连接失败!".$mysqli->connect_error); } /********************************可重复执行时需要的代码 start*******************************/ #2、创建预编译对象 $sql="select id,name,email from user1 where id>?;";//id,name,email和后面的结果集bind_result()对应 $stmt=$mysqli->prepare($sql) or die($mysqli->error); #3、绑定参数 $id=5; #4、参数赋值(第一个参数指代参数的类型缩写,string-s,int-i,double-d,bool-b $stmt->bind_param("i",$id);//绑定参数 $stmt->bind_result($id,$name,$email);//绑定结果集 #5、执行代码(返回布尔类型) $stmt->execute(); #6、取出结果集显示 while($stmt->fetch()) { echo "<br/>$id--$name--$email"; } /********************************可重复执行时需要的代码 end*******************************/ #7、结果以及释放 //释放结果 $stmt->free_result(); //关闭预编译语句 $stmt->close(); //关闭数据库连接 $mysqli->close();
?>
8、其他函数
(1 获取行数和列数 num_rows field_count (2 获取结果集的一列 :表头 例如 $result=$mysqli->query(); $result->fetch_field(); (3 取出数据 $row=$result->fetch_row(); //获得每一行数据 再通过 foreach($row as $val){} 取出每一个数据