pdo是什么?
pdo是一个扩展库,给不同的数据库提供相同的接口,这样的话在因业务需求更换数据库时就不用重写代码了,只需要换不同的驱动就行了。
需要两个条件:
- 支不支持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();
}
?>