PDO与异常
一. 为什么使用PDO
在WEB开发中,能够使用的数据库不仅仅只有MYSQL,还可能使用其他的数据库,比如:ORACLE、FIREBIRD、MSSQL等。
在PHP程序中,我们执行的是相同的操作,但是所写的操作函数就不一样,以连接数据库操作为例:
MySQL:mysql_connect
MSSQL:mssql_connect
ORACLE:oci_connect
所以,当我们要切换数据库时,就必须更换为相应扩展的操作函数
这无疑将提高程序人员操作的门槛,一方面我们需要学习不同的数据库操作函数,非常麻烦;另一方面维护起来也会增加负担。
所以,我们可以使用PDO,来达到使用相同的操作函数就能操作不同类型数据库的目的。
二. 什么是PDO
PDO即:PHP DATA OBJECT PHP数据对象。
在新版本的PHP中,PHP封装了一套PDO扩展库,专门用来操作不同类型的数据库
PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展实际上就是指封装好的PDO类。
三. 配置和开启PDO
既然我们的PDO是一个扩展,那么在使用时就必须先配置和开启这个扩展。
第一步,在php.ini文件中配置extension_dir配置项
第二步,在extension_dir指定的目录下查看php_pdo_mysql.dll文件是否存在并且在php.ini中开启相应的extension配置
第三步,重启apache并且检查PDO扩展是否开启成功
注意:在php5以下的版本中,在第二步除了要开启php_pdo_mysql.dll扩展配置项外还需开启php_pdo.dll配置项。
四. PDO的基本操作
PDO类的构造方法
我们首先来看一下PDO类的构造方法。
参数说明:
$dsn: 表示数据源名称,一般包括数据库地址,端口号,字符集,默认选择的数据库名。
$username:表示数据库的帐号
$password:表示数据库的密码
$driver_options:表示附加选项,用默认值即可。
我们来实例化一个PDO类的对象:
Code2.php
注意:以上host、port、charset、dbname的值不能用引号包裹,否则报错。
增删改操作
我们需要通过PDO对象调用exec方法来实现增删改操作。
新增操作:
修改操作和删除操作都与新增操作一样,都是通过exec方法执行相应的SQL语句来完成。
查询操作
PDO::query方法
我们需要通过PDO类下的query方法来执行查询SQL语句。
通过query方法执行SQL语句之后,如果执行成功则返回PDOStatement类的对象,如果失败返回false
PDOStatement::fetch方法
指定PDO::FETCH_ASSOC参数,相当于mysql扩展中的mysql_fetch_assoc函数的功能,都是返回一条记录,并且是关联数组。Code5.php
指定PDO::FETCH_NUM参数,相当于mysql扩展中的mysql_fetch_row函数的功能,都是返回一条记录,并且是索引数组。Code6.php
指定PDO::FETCH_BOTH参数,相当于mysql扩展中的mysql_fetch_array函数的功能,都是返回一条记录,并且是同时包含索引和关联元素的数组。Code7.php
指定PDO::FETCH_OBJ参数,返回一条记录,这条记录是将数据保存到一个对象中的。Code13.php
PDOStatement::fetchAll方法
Code8.php
PDOStatement::rowCount方法
获得查询出的结果一共有多少行。
PDOStatement::columnCount方法
返回查询结果一共有多少列(个字段)。
PDOStatement::fetchColumn方法
获得当前行的某个字段索引位置的数据的值。
PDOStatement::fetchObject方法
就相当于PDOStatement::fetch方法指定了PDO::FETCH_OBJ参数,效果一样。
每次执行,都将查询得到的返回一条记录,这条记录保存到了一个对象当中,其中对象的属性名就是这条记录的字段名,对象的属性值就是这条记录对应字段的数据值。
五. 预处理技术
为什么使用预处理技术
我们知道,数据库都是通过SQL语句来进行操作的,通常,执行SQL语句的机制是:
1, 准备sql语句
2, 发送sql语句到Mysql服务器执行
3, 在Mysql服务器端完整解析并执行sql命令并返回处理结果
以向news表新增一条数据为例:
1,构建SQL语句
$sql= “insert into news values(null,'title1','intro1','content1')”;
2,执行SQL语句
mysql_query($sql);
但是,如果一个脚本中需要向news表插入多条记录的时候,可能会连续执行如下的数据库操作:
当然,上面的sql语句都可以执行,但是采用这种执行的方式效率并不高,因为每次执行的sql语句的命令和结构都是一样的!只是其中的数据不一样而已!
但是由于采用传统的执行方式,每次都必须传输整条语句,而且对MySQL服务器而言,每次也都是重新解析并执行一条新的sql语句!
那么,有什么方式可以对此进行优化呢?
在MYSQL中,我们可以通过预处理技术来优化解决此类问题!
什么是预处理技术
概念:预处理技术,是最初由Mysql提出的一种为了减轻服务器负担的一种机制!
预处理技术的基本思路
基本思路:
将SQL语句一分为2,
第一部分是公共的操作部分;
第二部分是可变的数据部分;
每次执行该操作的时候,只需要传递可变的数据部分。
MYSQL客户端中的预处理技术
不带参数的预处理技术
第一步,准备预处理语句
语法:prepare 自定义的预处理语句名 from “SQL语句”;
第二步,执行预处理语句
语法:execute 预处理语句名;
第三步,删除预处理语句
语法:drop prepare 预处理语句名;
带参数的预处理技术
第一步,准备预处理语句
注意:可变数据的部分需要用占位符”?”来占位。
第二步,设置参数
语法:set @参数名=字段值;
注意:这里的参数名是自定义的,也就是说可以任意定义名字;这个名字与字段名无关。
第三步,执行预处理语句
注意:在执行的时候,需要指定使用的参数。
注意:在上图中执行预处理语句使用的参数,至于下图中占位符的位置有关,与字段名无关。
第四部,删除预处理语句
、
PDO中的预处理
第一步,准备预处理语句
我们需要通过PDO类中的prepare方法来实现。
Code14.php
第二步,绑定参数
我们需要通过PDOStatement类中的bindParam方法来实现。
通过bindParam方法可以通过绑定占位符的位置来绑定相应的参数。如下图中,从1到4号位置都绑定参数。
Code14.php
第三步,执行预处理语句
我们需要通过PDOStatement类中的execute方法来实现。
Code14.php
PDO中绑定参数的其他方法
第一种方式,绑定”:变量名”的形式绑定参数
第二种方式,绑定数组的方式绑定参数
六.PDO中的事务处理
回顾MYSQL客户端中的事务的处理
注意:如果要使用事务,则这个表必须是Innodb引擎。
第一步,开启事务
第二步,执行SQL语句操作
第三步,如果返回(执行失败)则回滚,如果成功则提交
回滚
提交
提交后最终的效果
PDO中的事务处理
第一步,开启事务
我们需要通过PDO类中beginTransaction来开启事务。
第二步,执行SQL语句
Code17.php
第三步,如果都执行成功则提交,如果有一个失败则回滚
Code17.php
七.PDO异常处理
PHP中的异常处理
我们通俗的理解为:欲加之罪。
我们PHP中存在一个预定义的异常类。
在程序中的实现
Code18.php
PDO中的异常
属性的设置
我们会通过PDO类中的setAttribute方法来设置属性。
PDO::ATTR_ERRMODE 属性名,表示设置错误信息报告方式
值:
PDO::ERRMODE_SILENT 表示设置为静默模式(默认的模式)
PDO::ERRMODE_WARNING 表示设置为警告模式
PDO::ERRMODE_EXCEPTION 表示设置为异常模式
实现PDO中的异常处理
第一步,设置错误处理模式为异常模式
第二步,监听代码
第三步,捕获异常处理
最终效果:
Code20.php
八.案例:封装PDO操作类
分析
1.连库相关操作
2.获得一条记录
3.获得多条记录
4.增删改操作
代码实现
Code21.php