PDO:数据库抽象层
PDO特点:跨数据库,支持预处理,支持事务
PDO的基本使用
1,实例化对象
实例化对象( new PDO() )
$pdo=new PDO(参数1,参数2,参数3);
参数:
1,数据库类型:主机名,数据库名,字符集,端口号(数据库类型必须小写)
2,用户名
3,密码
$pdo=new PDO('mysql:host=localhost;dbname=test2;charset=utf8;port=3306','root','admin');
2,发送sql语句
查询用(query),执行(增删改)用exec
如:$pdo->query('select * from test2')
query:返回结果集对象;
exec:返回受影响的行数;
3,处理查询结果
foreach:遍历结果集对象,如:foreach($res as $v =>$k){}
fetch:提取一条数据,如:$rows=$res->fetch();
fetchAll:提取所有数据;$rows=$res->fetchAll();
函数
$pdo->lastInsertId();获取最后插入的id
$pdo->errorInfo();获取错误信息;
<?php
//使用pdo连接数据库
//1,实例化对象
$pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306','root','admin') or die('数据库连接失败');
//发送SQL语句,查询用query,执行(增删改)用exec()
$res=$pdo->query('select *from test2');
$res=$pdo->exec("update test2 set name='张三1' where id=44");
//3,处理结果;
//3,1 query有结果集的情况
//3,1,1,foreach
foreach($res as $k=>$v){
var_dump($k);
var_dump($v);
}
//3,1,2,fetch 只返回一条结果集
$res->fetch();
var_dump($res);
//3,1,3,fetchAll返回所有的结果集
$rows=$res->fetchAll();
var_dump($rows);
//返回查询结果总数
//3,2 exec没有结果集直接返回受影响的行数
echo $res;
?>
PDO预处理
1,实例化对象;$pdo=new PDO()
2,发送预处理指令;两种方法:1:?; 2:起别名:name
$sql='select * from test2 where name=? and passwd=? ';
$stmt=$pdo->prepare($sql);
3,绑定参数 bindValue;三种方法:1,bindValue; 2,bindParam; 3,数组
$stmt->bindValue(1,$name);
$stmt->bindValue(2,$passwd);
4,执行发送
$stmt->execute();
5,处理返回结果
$res=$stmt->fetch()
代码部分
<?php
//pdo预处理
//1,实例化对象
$pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;prot=3306','root','admin');
//2,发送sql指令
//1,?形式;
$sql="select *from test2 where name=? and passwd=?";
//2,: 起别名
//$sql="select * from test2 where name=:name and passwd=:passwd";
$stmt=$pdo->prepare($sql);
//3,绑定参数
//1,bindValue
$stmt->bindValue(1,'张三');
$stmt->bindValue(2,'admin');
//2,bindParam,次方法中第二个参数不能为固定值
$stmt->bindParam(1,$name);
$stmt->bindParam(2,$passwd);
//3,array()数组形式
$arr=array('张三','admin');//?
$arr=array(':name'=>'张三',':passwd'=>'admin');//:起别名
//4,发送执行
$stmt->execute($arr);//数组形式时在这里必须传入数组
$res=$stmt->fetchAll(PDO::FETCH_NUM);
var_dump($res);
?>
MySQL事务处理
将多条sql语句(增删改)作为一个操作单元,要么都成功,要么都失败;
ps:操作表必须是innoDB
事务处理的步骤:
$pdo->beginTransaction():开启事务
$pdo->commit():提交一次事务
$pdo->rollback():回滚一次事务
代码部分
<?php
//mysql事务处理
//实例化对象
$pdo=new PDO('mysql:host=localhost;dbname=test1;charset=utf8;port=3306','root','admin');
//开启事务
$pdo->begintransaction();
try{
//sql操作
$num=$pdo->exec("update test2 set name='张三1111' where id=8");
if($num <1 ){
throw new PDOException('第一个失败了',10086);//抛出错误
}
//sql操作
$num1=$pdo->exec("update test2 set name='李四2222' where id=9");
if($num1 <1){
throw new PDOException('第二个失败了',10010);//抛出错误
}
if($num>=1 && $num1 >=1){
$pdo->commit();//成功的话提交事务
echo "两个都成功了";
}
}catch(PDOException $e){
$pdo->rollback();// 如果失败回滚
echo $e->getMessage();
echo $e->getCode();
}
?>
setAttribute
设置结果集提取的类型:$pdo->setAttribute();
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MEDO,PDO::FETCH_NUM);
PDO::FETCH_ASSOC:关联数组
PDO::FETCH_NUM:索引数组
设置结果集键名的大小写:
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE:UPPER)
(PDO::ATTR_CASE,PDO::CASE:LOWER)
设置错误处理模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)
(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING)
获得模式:$pdo->getAttribute(PDO::ERRMODE)