您的位置:首页 > 编程语言 > PHP开发

PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

2013-10-23 21:20 856 查看
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'),'sd@sohu.com',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='ssd@qq.com';
$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){} 取出每一个数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: