一、什么是PDO?
PHP DATA OBJECT
PHP数据库抽象层
位于PHP与数据库中间的一个桥梁
二、为什么要使用PDO?
方便数据库的迁移
方便数据库的升级
减少学习成本
使程序更加安全
防止sql注入
提高代码效率
三、何时采用PDO?
绝大多数操作数据库的项目都使用PDO
四、PDO的安装
1)类库文件需要存在
php根目录下的ext文件夹中:php_pdo.dll、php_pdo_mysql.dll
2)在php的配置文件php.ini中须开启
extension=php_pdo.dll
extension=php_pdo_mysql.dll
五、如何使用PDO?
1)PDO核心类
①连接数据库
new PDO($dsn,$username,$password)
$dsn:
1.直接写入字符串(推荐)
$dsn="mysql:host=localhost;dbname=test;charset=utf8";
2.远程加载文件(不推荐)
$dsn="uri:file:///d:/dsn.txt";
$dsn="uri:http://www.baidu.com/dsn.txt";
dsn.txt文件中的内容为:
mysql:host=localhost;dbname=test;charset=utf8
3.设置php.ini(不推荐)
在php的配置文件php.ini中找到:[PDO],若没有找到则在文件最后手动添加:
[PDO]
pdo.dsn.mydsn="mysql:host=localhost;dbname=test;charset=utf8";
在代码中引入:
$dsn="mydsn";
②判断错误
使用PDOException异常处理
③设置字符集
$pdo->query("set names utf8");
④错误模式设置
1.手动抛出错误异常,放在sql语句执行之后
PDO::errorCode()
PDO::errorInfo()
2.设置自动抛出错误异常,放在sql语句执行之前
PDO::setAttribute()
静默模式(默认)
PDO::ATTR_ERRMODE=>PDO::ERRMODE_SILENT
警告模式
PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING
异常处理模式(推荐)
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
⑤执行sql语句
1.exec()
执行增、删、改语句,成功返回受影响行数,失败返回false
2.query()
执行查询语句,成功返回PDO预处理对象(可作二维数组处理,直接用foreach遍历)
3.lastInsertId()
返回最近一次插入行的ID或序列值
⑥关闭数据库连接
$pdo=null; 或 unset($pdo);
2)PDO预处理类
1.什么是预处理?
就是将sql语句的语法提前解析
2.为什么要使用预处理?
效率提高,语法只解析一次
有效防止sql注入
3.何时采用预处理?
框架当中基本全是预处理
4.如何使用预处理?
①准备参数,依次为预处理对象中占位符对应的字段
②创建预处理对象
$stmt=$pdo->prepare(" ");
③绑定参数,标识符从1开始,有几个参数就依次绑定几次
方式一:
$stmt->bindParam(1,$i);
$stmt->bindParam(2,$j);
方式二:
$stmt->bindValue(1,$i);
$stmt->bindValue(2,$j);
方式三:
可以使用数组对应各占位符的值,在下一步执行对象时将该数组传入
$arr=array('第一个占位符对应的值','第二个占位符对应的值',...);
$arr=array('字段名1'=>'以字段名1为占位符对应的值','字段名2'=>'以字段名2为占位符对应的值',...);
④执行对象
$stmt->execute();
//$stmt->execute($arr);
⑤占位符
?
在绑定参数时须指定各占位符对应位置,从1开始
:字段名称
在绑定参数时须指定各对应的字段名称
⑥查询处理
$stmt->execute()执行完毕后,解析结果:
1.$stmt->fetch(PDO::FETCH_ASSOC)
解析一条,需要循环解析
while($stmt->fetch(PDO::FETCH_ASSOC){
}
2.$stmt->fetchAll(PDO::FETCH_ASSOC)
解析所有结果,将结果返回到一个二维数组中
3.$stmt->rowCount()不仅可以获取增、删、改的受影响行数,也可获取查询的记录行数
3)PDO的异常处理类
PDOException
PDOException::getCode() 异常号
PDOException::getMessage() 异常信息
4)事务处理
1.什么是事务处理
把一整件事情作为一个整体,作为一个事务
2.为什么要使用事务处理
程序的安全性、完整性
3.什么时候使用事务处理
重要数据
4.如何使用事务处理
①开启事务
PDO::beginTransaction()
②执行sql语句
PDO::exec()
③执行事务或回滚事务
PDO::commit()
PDO::rollBack()
try{
//连接数据库
$dsn="mysql:host=localhost;dbname=test;charset=utf8";
$username="autumn";
$password="ZWQ900815";
$pdo=new PDO($dsn,$username,$password);
//设置字符集
$pdo->query("set names utf8");
//错误模式设置
//方式一:手动抛出错误异常,放在sql语句执行之后
/*
$errorInfo=$pdo->errorInfo();
//发生错误时,$errorInfo[1]为错误号和$errorInfo[2]为错误信息
//无错误时,$errorInfo[1]和$errorInfo[2]均为空
if(!empty($errorInfo[1])){
//抛出错误异常
throw new PDOException($errorInfo[2],$errorInfo[1]);
}
*/
//方式二:自动抛出错误异常,放在sql语句执行之前
//设置PDO::ATTR_ERRMODE(静默模式[默认]、警告模式、异常处理模式[推荐])
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//准备sql语句
//$sql01="insert into cms_user(username,password) values('admin02','1234')";
//$sql02="delete from cms_user where id=2";
//$sql03="update cms_user set username='admin' where id=1";
//$sql04="select1 * from cms_user";
//执行sql语句
//exec 处理增、删、改语句,返回受影响行数
//query 处理查询语句
//$pdo->exec($sql01);
//返回最近一次插入行的ID或序列值
//echo $pdo->lastInsertId();
//$pdo->exec($sql02);
//$pdo->exec($sql03);
/*
$data=$pdo->query($sql04);
foreach ($data as $key=>$val) {
echo $val['id']."\n";
echo $val['username']."\n";
echo $val['password']."\n";
}
*/
//预处理
//方式一
/*
//1.准备参数,依次为下面要处理的sql语句中?占位符对应的字段值
$id=1;
$username='autumn';
//2.创建预处理对象
$stmt=$pdo->prepare("delete from cms_user where id=? and username=?");
//3.绑定参数,$id、$username为引用传参,参数赋值可在前可在后
//绑定参数标识符从1开始,有几个参数变量,就依次绑定几次
$stmt->bindParam(1,$id);
$stmt->bindParam(2,$username);
//绑定值,变量值的赋值只能在前,不能在后,作用等同于bindParam()
//$stmt->bindValue(1,$id);
//$stmt->bindValue(2,$username);
//4.执行对象
$stmt->execute();
*/
//方式二
/*
$id=1;
$username='autumn';
$stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");
$stmt->bindParam(":id",$id);
$stmt->bindParam(":username",$username);
$stmt->execute();
*/
//方式三(推荐)
//若使用“?”作为占位符
//$stmt=$pdo->prepare("delete from cms_user where id=? and username=?");
//$arr=array(1,'autumn');
//若使用“:字段名称”作为占位符
/*
$stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");
$arr=array("id"=>1,"username"=>"autumn");
$stmt->execute($arr);
echo $stmt->rowCount(); //受影响行数
*/
$stmt=$pdo->prepare("select * from cms_user where id>:id");
$arr=array("id"=>3);
$stmt->execute($arr);
$data=$stmt->fetchAll(PDO::FETCH_ASSOC);
echo $stmt->rowCount(); //也可获取查询的记录行数
echo "
";";var_dump($data);
echo "
//执行事务处理
/*
//1.开启事务
$pdo->beginTransaction();
//2.执行sql语句
$aff01=$pdo->exec("update cms_user set username='admin01' where id=1");
//sql语句本身有错误而无法执行时会自动抛出错误异常,而当sql语句可执行后受影响行数为0时,需要手动抛出异常
if($aff01==0){
throw new PDOException("受影响行数为0!");
}
$aff02=$pdo->exec("insert into cms_user(username,password) values('admin02','0000')");
if($aff02==0){
throw new PDOException("受影响行数为0!");
}
//3.执行事务
$pdo->commit();
*/
//关闭数据库连接
$pdo=null;
}catch(PDOException $e){
//4.回滚事务
//$pdo->rollBack();
//异常处理
//$e->getCode();//异常号
//$e->getMessage();//异常信息
echo "(".$e->getCode().")".$e->getMessage();
}