"Extension:$extension, Author:$name\n"; } }
可移植性
区分大小写的列
PDO 旨在令使用可移植 SQL 的脚本运行良好、可移植。本文中提及的所有查询(调用存储过程除外)在使用任何 PDO 驱动程序时其运行性能应该相同 - 包括所有绑定输入变量和绑定输出列。
但有一个转换问题 - 当您使用 PDO_FETCH_ASSOC 抓取数据时,不同的驱动程序会以不同的方式返回列名 - 某些会将列名转化为大写,某些转换为小写,某些则会使其呈查询中指定的样式。这对于 PHP 脚本来说是一个潜在的问题,因为数组键区分大小写。PDO 提供了一个兼容性属性来帮助规范脚本的结果。下面的小代码段是上面 PDO_FETCH_BOUND 示例的可移植版本,因为 setAttribute() 方法调用会指导 PDO 将抓取返回的列名全部转换为大写:
$dbh = new PDO(''OCI:'', ''scott'', ''tiger''); $dbh->setAttribute(PDO_ATTR_CASE, PDO_CASE_UPPER); stmt = $dbh->prepare("SELECT extension, name from CREDITS"); if ($stmt->execute()) { $stmt->bindColumn(''EXTENSION'', $extension); $stmt->bindColumn(''NAME'', $name); while ($stmt->fetch(PDO_FETCH_BOUND)) { echo "Extension:$extension, Author:$name\n"; } }
除了 PDO_CASE_UPPER 之外,还有 PDO_CASE_LOWER(它会将列名转换为小写)和 PDO_CASE_NATURAL(它是默认选项:使列保持数据库驱动程序返回的形式)。
错误和错误处理
可移植脚本的另一个难题是处理从各种数据库处理程序返回的各种不同的错误消息;某些数据库对于程序化处理错误的支持能力很差,而其他一些数据库则具有非常丰富的错误代码。只要可行,PDO 将为您的脚本提供一个统一的错误代码,从而使您不必为应对可移植性的这个方面所累。当然,PDO 还会为驱动程序提供原生错误代码和错误消息,以防您需要用它来进行诊断,或者错误代码映射不完整。
另一个困扰 PHP 数据库扩展的一致性问题是错误处理策略的一致性:某些扩展会返回的错误代码需要您手动抓取错误字符串,而其他一些扩展则只是发出 PHP 警告。PDO 允许您从下列三种不同的错误处理策略中选择一种:
·PDO_ERRMODE_SILENT 这是默认模式;它只是使用语句和数据库句柄对象的 errorCode() 和 errorInfo() 方法为您设置要检查的错误代码。
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] 是驱动程序特定的错误字符串 }
请注意,与警告或异常相比,静默模式针对运行时错误使用的资源最少,但是为了获
|