PDO扩展为PHP定义了一个访问数据库的轻量的,持久的接口。实现了PDO接口的每一种数据库驱动都能以正则扩展的形式把他们各自的特点表现出来。注意;利用PDO扩展自己并不能实现任何数据库函数。你必须使用一个特定的数据库PDO驱动去访问数据库。
PDO提供了一个数据访问抽象层,这就意味着,无论你使用的是哪一种数据库,你均可以用一样的函数去进行查询的获取数据。PDO并不提供数据提取,它不会重写SQL语句,或者模仿这些功能。你须要使用一个成熟的提取层,若是你须要的话。php
怎么样,是否是看了译文就有一种恍然大悟的感受了?
没有?
那说的再详细点。
咱们为何要使用PDO?
一、更换数据库时取得极大便利
在PHP4/3时代,PHP要利用php_mysql.dll、php_pgsql.dll、php_mssql.dll、 php_sqlite.dll等等扩展来链接MySQL、PostgreSQL、MS SQL Server、SQLite,这其实也没什么。也就是在配置时多添句话就好了。
可怕的是,这些扩展和各自对应的数据库打交道时,他们各自的函数有不少是不同的。
好比:
PHP利用libmysql.dll和MYSQL打交道时,若是要从数据表中提取数据做为关联数组,用的是mysql_fetch_accoc,而若是要从postgre数据库取得一样的结果,你就不得不用pg_fetch_assoc。
很简单的例子说明了很重要的问题,假如你要更换数据库类型,好比从MYSQL更换成POSTGRE,你就不得把你全部和数据库有关的程序都改一遍。这时候,你应该会明白,为何我不用PDO??
二、极大提升程序运行效率
针对上面的状况,也许你会说,我可使用ADODB(LITE),PEAR::db来实现对不一样类型数据库函数的封装啊。这样子,即便我更换数据库,也不须要修改程序。
答:php代码的效率怎么可以和直接用C/C++写的扩展效率比较呢?根本不是一个数量级的。
OK,从如今开始用PDO进行你的开发吧。 mysql
安装 sql
PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问 抽象层,这样,不管你使用什么数据库,你均可以经过一致的函数执行查询和获取数据。注意,你并不能使用PDO扩展自己执行任何数据库操做,你必须使用一个database-specific PDO driver (针对特定数据库的PDO驱动)访问数据库服务器。数据库
PDO并不 提供数据库 抽象,它并不会重写SQL或提供数据库自己缺失的功能,若是你须要这种功能,你须要使用一个更加成熟的抽象层。数组
PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可使用。PDO须要PHP5核心OO特性的支持,因此它没法运行于以前的PHP版本。缓存
在Unix环境下PHP5.1以上版本中:安全
./configure --with-zlib --enable-pdo=shared --with-pdo-sqlite=shared --with-sqlite=shared
在Windows环境下PHP5.1以上版本中:服务器
修改php.ini后重启http服务器。函数
OK,PDO安装完毕。post
PDO中包含三个预约义的类
PDO中包含三个预约义的类,它们分别是 PDO 、PDOStatement 和 PDOException ,下面将分别简单介绍一下。后面的系列相关文章会使用若干示例介绍这几个类的使用。
1、PDO
表明一个PHP和数据库之间的链接。
方法:
2、PDOStatement
表明一条预处理语句以及语句执行后的联合结果集(associated result set)。
方法:
3、PDOException
返回PDO触发的错误。你不能从你的代码中抛出一个PDOException异常。
错误处理
为适合你的应用开发,PDO 提供了3中不一样的错误处理策略。
这是默认使用的模式。PDO会在statement和database对象上设定简单的错误代号,你可使用PDO->errorCode() 和 PDO->errorInfo() 方法检查错误;若是错误是在对statement对象进行调用时致使的,你就能够在那个对象上使用 PDOStatement->errorCode() 或 PDOStatement->errorInfo() 方法取得错误信息。而若是错误是在对database对象调用时致使的,你就应该在这个database对象上调用那两个方法。
做为设置错误代号的附加,PDO将会发出一个传统的E_WARNING信息。这种设置在除错和调试时是颇有用的,若是你只是想看看发生了什么问题而不想中断程序的流程的话。
做 为设置错误代号的附件,PDO会抛出一个PDOException异常并设置它的属性来反映错误代号和错误信息。这中设置在除错时也是颇有用的, 由于他会有效的“放大(blow up)”脚本中的出错点,很是快速的指向一个你代码中可能出错区域。(记住:若是异常致使脚本中断,事务处理回自动回滚。)
异常模式也是很是有用的,由于你可使用比之前那种使用传统的PHP风格的错误处理结构更清晰的结构处理错误,比使用安静模式使用更少的代码及嵌套,也可以更加明确地检查每一个数据库访问的返回值。
关于PHP中异常的更多信息请看Exceptions章节
PDO 使用基于SQL-92 SQLSTATE 的错误代号字符串;特定的PDO驱动应当将本身自己的代号对应到适当的SQLSTATE代号上。PDO->errorCode() 方法只返回单一的SQLSTATE代号。若是你须要关于一个错误的更加有针对性的信息,PDO也提供了一个PDO->errorInfo() 方法,它能够返回一个包含了SQLSTATE代号,特定数据库驱动的错误代号和特定数据库驱动的错误说明字符串。
事务
如今你已经经过PDO创建了链接,在部署查询以前你必须搞明白PDO是怎样管理事务的。若是你之前从未遇到过事务处理,(如今简单介绍一下:)它们提供了4个主要的特性:原子性 ,一致性 ,独立性 和持久性 (Atomicity, Consistency, Isolation and Durability,ACID)通俗一点讲,一个事务中全部的工做在提交时,即便它是分阶段执行的,也要保证安全地应用于数据库,不被其余的链接干扰。 事务工做也能够在请求发生错误时轻松地自动取消。
事务的典型运用就是经过把批量的改变“保存起来”而后当即执行。这样就会有完全地提升更新效率的好处。换句话说,事务可使你的脚本更快速同时可能更健壮(要实现这个优势你仍然须要正确的使用它们)。
不 幸运的是,并非每一个数据库都支持事务,所以PDO须要在创建链接时运行在被认为是“自动提交”的模式下。自动提交模式意味着你执行的每一个查询都 有它本身隐含的事务处理,不管数据库支持事务仍是因数据库不支持而不存在事务。若是你须要一个事务,你必须使用 PDO->beginTransaction() 方法建立一个。若是底层驱动不支持事务处理,一个PDOException就会被抛出(与你的异常处理设置无关,由于这老是一个严重的错误状态)。在一个 事物中,你可使用 PDO->commit() 或 PDO->rollBack() 结束它,这取决于事务中代码运行是否成功。
当脚本结束时或一个链接要关闭时,若是你还有一个未处理完的事务,PDO将会自动将其回滚。这是对于脚本意外终止的状况来讲是一个安全的方案——若是你没有明确地提交事务,它将会假设发生了一些错误,为了你数据的安全,因此就执行回滚了。
警告
自动回滚仅发生于你经过 PDO->beginTransaction() 创建的事务。若是你用手动方式执行了一个开始事务的查询,PDO就没法知道它的状况,这样在倒霉的事情发生时它将没法回滚。
链接是经过实例化PDO基类创建的。对创建链接来讲,你使用哪一个数据库驱动并无关系,你只管用PDO这个类名就好了。PDO类的构造器接受一个能够指定数据源(DNS)的参数和可选的数据库用户名、密码参数。
例1:链接到MySQL:
若是发生了错误,一个PDOException异常对象将被抛出。若是你想处理这个错误,你应该捕获这个异常,或者你也能够选择将它交给一个经过set_exception_handler()设置的应用程序全局异常处理器。
例2:链接错误处理
警告:
若是你的应用程序没有捕获从PDO构造器中抛出的异 常,Zend引擎就会作出响应终端脚本的执行并显示一条跟踪信息。这条跟踪信息有可能会暴露完整的数据库链接信息,包括用户名和密码。捕获这个异常是你的 职责,不管是明确捕获(经过一个catch语句)仍是经过set_exception_handler()隐含捕获。
成 功创建数据库链接以后,一个PDO类的实例就返回到了你的脚本中。链接在PDO对象的生存期内会一直保持活动状态。要关闭这个链接,你须要经过删 除全部指向它的引用来销毁这个对象。你能够经过向指向这个对象的变量赋一个NULL值作到这一点。若是你没有明确地这样作,PHP会在脚本结束时自动关闭 这个链接。