加入收藏 | 设为首页 | 会员中心 | 我要投稿 焦作站长网 (https://www.0391zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP 5 数据对象 (PDO) 抽象层与 Oracle

发布时间:2020-03-22 04:38:00 所属栏目:PHP教程 来源:互联网
导读:PHP 5 数据对象 (PDO) 抽象层与 Oracle


if (!$dbh->exec($sql)) {
 echo $dbh->errorCode() ."<BR>";
 $info = $dbh->errorInfo();
 // $info[0] == $dbh->errorCode() 统一的错误代码
 // $info[1] 是驱动程序特定的错误代码
 // $info[2] 是驱动程序特定的错误字符串
}

·
PDO_ERRMODE_WARNING
除了设置错误代码之外,PDO 还会发出 PHP 警告,您可以使用常规的 PHP 错误处理程序捕获该警告,并集中应用您准备好用于应用程序的任何错误处理/记录策略,或者只是使该错误显示在浏览器中(在内部测试过程中非常有用)。
·
PDO_ERRMODE_EXCEPTION
除了设置错误代码之外,PDO 还会抛出一个 PDOException,并将其属性设置为包含该错误代码和信息。然后,您可以在代码的较高级别捕获该异常,使用全局异常处理程序捕获该异常,或者不对其进行处理而终止脚本(此时将回滚任何未决的事务)。

try {
 $dbh->exec($sql);
} catch (PDOException $e) {
 // 显示警告消息
 print $e->getMessage();
 $info = $e->errorInfo;
 // $info[0] == $e->code; unified error code
 // $info[1] 是驱动程序特定的错误代码
 // $info[2] 是驱动程序特定的错误字符串
}


请注意,与警告或异常相比,静默模式针对运行时错误使用的资源最少,但是为了获得该速度,您牺牲了一些简单性,而变得有一点复杂。

统一错误代码表当前包括下列常量: PDO_ERR_NONE、PDO_ERR_CANT_MAP、PDO_ERR_SYNTAX、PDO_ERR_CONSTRAINT、PDO_ERR_NOT_FOUND、PDO_ERR_ALREADY_EXISTS、PDO_ERR_NOT_IMPLEMENTED、PDO_ERR_MISMATCH、PDO_ERR_TRUNCATED、PDO_ERR_DISCONNECTED。

这些常量所代表的意思字面即可推知,但是 PDO_ERR_CANT_MAP 代码除外;这是一个 PDO 特定的代码,也就是说它无法将驱动程序特定的代码映射到统一的错误代码,因此您应该查询 errorInfo() 方法返回的驱动程序特定代码来获得更多信息。

数据类型

PDO 在某种程度上类型不可知,因此它喜欢将数据表示为字符串,而不是将其转换为整数或双精度类型。此时您可能对此有些迷惑,但是原因非常简单:字符串类型是最精确的类型,在 PHP 中具有最广泛的应用范围;过早地将数据转换为整数或者双精度类型可能会导致截断或舍入错误。通过将数据以字符串抽出,PDO 为您提供了一些脚本控制,您可以使用普通的 PHP 类型转换工具(如数学运算过程中的转换和隐式)来控制如何进行转换以及何时进行转换。


NULL

如果结果集中的某列包含一个 NULL 值,PDO 则会将其映射为 PHP null 值。Oracle 在将数据返回 PDO 时会将空字符串转换为 NULL,但是 PHP 支持的任何其他数据库都不会这样处理,从而导致了可移植性问题。PDO 提供了一个驱动程序级属性 PDO_ATTR_ORACLE_NULLS,该属性会为其他数据驱动程序模拟此行为:


$dbh = new PDO('OCI:', 'scott', 'tiger');
$dbh->setAttribute(PDO_ATTR_ORACLE_NULLS, true);
// 现在从此 $dbh 打开的任何语句中的
// 空字符串都将被转换为 NULL

POD 的现状和未来


PDO 现在仍相当不成熟,但是会快速成熟起来。在编写本文之时,我在本文中提到的任何内容都能够通过 PDO_OCI 驱动程序适用于 Oracle 8 或更高版本(在 Oracle 8.0 和 9.2 上测试过)。

已经计划增加以下主要特性,在不久将可以使用:

1.使用 PHP 流的 LOB 支持。 使用绑定参数,您能够将任何流资源(如文件、套接字、HTTP 资源、压缩/筛选的流)作为输入或输出参数传递到在 LOB 上运行的查询中。与之相似,类型为 LOB 的输出参数将表现为 PHP 流,因此您可以使用 fread()、fwrite()、fseek() 和其他流函数来访问这些参数。此时,在 PDO 中根本没有 LOB 支持。
2.持久性连接和缓存的预处理语句。 持久性连接使您能够避免在每个页面命中时打开和关闭数据库服务器连接。缓存的预处理语句又前进了一步,它使您能够持久保持查询的预处理版本以及数据库句柄。
3.游标。 目前,PDO 只提供前向只读游标,但是将来会提供可滚动游标(需要基础驱动程序支持)、REF-CURSOR、使用游标进行定位更新,以及可更新滚动游标。

我们希望在 PHP 5.1 中默认启用 PHP 扩展(距此目标尚远),但是在此之前,我们希望能让 PDO 在 PHP 5.0 发布时稳定运行,但是我们日常工作中的压力稍稍拖延了这些工作。同时,通过 PECL 发布 PDO 使我们能够在收到问题报告时做出回应,并根据不同于 PHP 5.0 发布时间表的时间表发布修复版本,因此您在 PHP 5.1 发布前即可使用 PDO。

我们需要您的反馈

如果您试用了 PDO,并且发现了问题,请务必使用我们的错误跟踪软件将其报告给我们。如果您使用的是 Oracle 驱动程序,则请使用此页:

?package=PDO_OCI

如果您使用的是其他驱动程序,则请用其名称替换该 URL 中 PDO_OCI。

如果您使用 PDO 时遇到问题,或者针对某些特性存在疑问,或者具有特性请求,请联系 pecl-dev@lists.php.net。如果您愿意,当然还可以直接联系我 (wez@php.net),但是请注意,我每天都会收到大量有关 PHP 的电子邮件;您可能会发现如果首先与前面的邮件列表联系会更快得到答复。

-----------
关于作者
Wez Furlong 是 Brain Room Ltd. 的技术总监,他在该公司不但使用 PHP 用于 Web 开发,还将其用作 Linux 和 Windows 应用程序和系统的嵌入式脚本引擎。Wez 是 PHP 的核心开发人员,经常向 SQLite、COM/.Net、ActivePHP、mailparse 和 Streams API 等投稿,他是 PECL 即 PHP 扩展社区库的“头儿”。他的咨询公司的网页为 。

(编辑:焦作站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读