PDO基础知识
一、什么是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 "<pre>"; var_dump($data); echo "</pre>"; //执行事务处理 /* //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(); }