PHP Data Object

PDO一是PHP数据对象(PHP Data Object)的缩写。

因为最近再用laravel/lumen框架,所以我觉得有必要把这东西重新梳理一下,以便能够更精确地处理各个细节。

1、创建连接

原型:

dsn 有多种方式可以来实现。
1、标准dsnmysql:dbname=testdb;host=127.0.0.1;port=3306
2、文件模式。将标准dsn写入文件,然后使用uri:file:///path/to/dsnfile来导入。
3、将信息定义在php.ini中。不能是在 .htaccesshttpd.conf 中 。

username 用户名, password 密码, driver_options 选项(将在下文说明)。

这里只进行对标准dsn的实现。

创建成功返货一个PDO对象。创建失败者会抛出一个PDOException异常。

2、执行SQL语句

执行成功将返回受影响行数,执行失败将返回布尔类型false
exec可执行包括但不仅限于insertupdatedelete等类型的SQL
select语句无效。

可是使用lastInsertId来获取insert语句的自增ID

对于执行失败的语句可以使用errorCodeerrorInfo来获取错误信息。

3、查询SQL语句

query查询失败返回false, 查询成功后pdo会返回一个statement对象。statement对象实现了Traversable接口,所以我们可以通过foreach遍历来获取数据。

另外,官方文档中说到Traversable接口无法在 PHP 脚本中实现的内部引擎接口。IteratorAggregateIterator 接口可以用来代替它。

刚刚说到exec方法,可以执行insertupdatedelete等类型的SQL,但是不能执行selectSQL。而query方法这个2种都可以执行。

4、PDOStatement

PDOStatement代表一条预处理语句,并在该语句被执行后代表一个相关的结果集。

上面无论exec方法,还是query方法都存在sql注入的风险。使用预处理执行就可以消除这种风险。

prepareexecute这2个方法,是核心方法。

预处理执行有2种占位符:一种是命名参数占位符、还有一种是问号占位符。下面进行代码演示。

fetch方法获取一个结果,并将指针移向下一个结果。
fecthAll方法获取所有结果。

这2个方法可以传入参数fetch_style,来控制返回数据的格式。

除了可以在execute传参的方式来绑定参数,还可以使用bindParambindColumnbindValue3个方法来绑定参数。

bindValue 对应 命名参数占位符
bindColumn 对应 问号占位符
bindParam 2者都可以

这里主要说明下演示bindParam

这里需要说明下,bindParam有3个参数。

第一个参数传入绑定变量名称,如果是问号占位符, 从索引1开始递增。
第二个参数, 变量, 不能直接传值
第三个参数, 可选, 变量类型 PDO::PARAM_STR、 PDO::PARAM_INT …

预处理不仅可以执行select语句,也可以执行insertupdatedelete语句。
并且提供了debugDumpParams方法可以用来调试。

5、设置数据库连接属性

连接属性可以在初始化pdo对象的时候设置,也可以使用getAttributesetAttribute进行设置查看。

上面是可以设置的属性,但是对于mysql数据库来说,并不是所有属性都可以设置的。

6、错误模式

PDO有3中错误模式:PDO::ERRMODE_SLINETPDO::ERRMODE_WARNINGPDO::ERRMODE_EXCEPTION

PDO::ERRMODE_SLINET是静默模式,pdo的默认模式,在这种模式下,sql执行失败返回结果为false

PDO::ERRMODE_WARNING是警告模式。在这种模式下,sql执行失败返回结果为false并且会抛出一个warning的错误,但是不影响程序执行。

PDO::ERRMODE_EXCEPTION是异常模式。在这种模式下,sql执行失败会抛出一个PDOException的知名错误,如果不将它捕获,程序将停止执行。laravel/lumen框架默认为异常模式。

6、事务

这里只是一个简单的示例,事务涉及很多方面,不在这里扩展叙述了。