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)