PHP学习模块之pdo模块

pdo是什么?

pdo是一个扩展库,给不同的数据库提供相同的接口,这样的话在因业务需求更换数据库时就不用重写代码了,只需要换不同的驱动就行了。

 

需要两个条件:

  1. 支不支持PDO

开启PDO步骤:找到php.ini 
开启:pod_myql_dll扩展 
重启apache 
验证是否登录成功

2.有没有相对应的驱动

可以在数据库官网上查找

创建数据库对象

创建数据库的步骤:

1.设置dsn:

1)设置host

2)设置数据库名字

3)设置字符集

举例:

$dsn=’mysql:host=localhost;dbname=demo;charset=utf8’;

 

2.连接数据库

写SQL语句

操作数据库

例子:

<?php 
//连接数据库
$dsn='mysql:host=localhost;dbname=demo;charset=utf8';
try{
	$pdo=new PDO($dsn,"root","");
	//设置错误模式
	$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
	exit("数据库连接错误".$e->getMessage());
}
try{
	$sql="insert into user(name,password,money) value('lisi','123',2000)";
	$num=$pdo->exec($sql);

}catch(PDOException $e){
	echo $e->getMessage();
}

常用的数据库操作:

exec   执行不要结果集的语句    比如 增删改

query    执行要结果集的语句     比如查询

异常设置:

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

返回自增id:

echo $pdo->lastInsertId();

事务

多条SQL语句同时执行,要么全部成功,要么全部失败并回滚到未执行的状态

举例:

银行转账

假如甲方给乙方转账500元,那么一次成功的银行转账是:

甲方的账户余额减少500元,

且乙方账号上增加500元

所以应该将这两次转账视为一个原子操作,即不能分开,而这就是一个事务。

与事务有关的函数:

$pdo->beginTransaction();   开启事务

$pdo->commit();     提交事务

$pdo->rollback();    回滚事务到初始状态

注:事务的操作时在对数据库的处理时进行操作的

例子:

<?php
//1.创建dsn
$dsn="mysql:host=localhost;dbname=demo;charset:utf8";
//2.开始连接
//4.用try..catch捕获异常
try{
	$pdo=new PDO($dsn,"root","");
	//5.设置错误模式
	$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
	exit($e->getMessage());
}

//张三
try{
	//10.开启事务
	$pdo->beginTransaction();
	//6.写SQL语句
	$sql="update user set money=money-500 where id=1 ";
	//7.执行SQL语句
	$res=$pdo->exec($sql);
	//8.判断SQL语句是否执行成功,不成功就抛出异常
	if($res>0){
		echo "张三转账500<br />";
	}else{
		throw new PDOException("张三转账失败");
		
	}
	//李四
	$sql="update user set money=money+500 where id=2";
	$res=$pdo->exec($sql);
	if($res>0){
		echo "李四收账500<br />";
	}else{
		throw new PDOException("李四收账失败");
		
	}
	//11提交事务
	$pdo->commit();
	echo "交易成功<br />";
}catch(PDOException $e){
	//9.在catch中对异常进行打印
	exit($e->getMessage());
	//12事务回滚
	$pdo->rollback();
}

//3.判断连接是否成功
//var_dump($pdo);


?>

pdo数据库操作优化

PDO预处理

预处理的原理:

我们以一个插入例子为例:insert into myblog(name,password)values(?,?);

1.预处理:先将SQL模板语句发送到数据库,至于后边的值先置于?号

2.数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。

3.执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

好处

如果单一插入,那么每次插入都会进行编译,插入操作,效率太慢,提高插入的效率

与pdo预处理有关的函数:

$pdo->prepare();   预处理语句,返回一个PDOStatement对象(我们假定为$stmt),两种,一种用?一种用:+变量

$stmt->bindParam();   参数绑定,有两个参数,第一个是数字(如果上一个函数是?,那么就用数字标识;如果是第二种,就直接使用就行了)

$stmt->execute();   处理语句,参数可以包含一个数组,数组是prepare中的参数

当SQL语句为查询语句时,就要用到下面的函数了:

$stmt->fetch()   提取查询信息,常和while结合,参数:

PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组

其他常用参数:

PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组

PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组

例子:

<?php
$dsn="mysql:host=localhost;dbname=demo;charset:utf8";
try{
	$pdo=new PDO($dsn,"root","");
	$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
	exit("连接错误".$e->getMessage());
}
try{
/*$sql="update user set name='sun'where money=4000";
$res=$pdo->exec($sql);
if($res>0){
	echo "插入成功";
}else{
	echo "插入失败";
}*/
//预处理
/*$stmt=$pdo->prepare("insert into user(name,password,money)values(:name,:password,:money)");*/
$stmt=$pdo->prepare("update user set money=? where id=?");
//开始绑定
/*$stmt->bindParam(':name',$name);
$stmt->bindParam(':password',$password);
$stmt->bindParam(':money',$money);
$name="tang";
$password="123";
$money=10000;
*/
$stmt->execute([7000,6]);
}catch(PDOException $e){
	echo $e->getMessage();
}

?>

 

猜你喜欢

转载自blog.csdn.net/sinat_35161044/article/details/81984093