PHP 5 数据对象 抽象层与 Oracle_php基础_脚本之家

一名新 PHP 数据对象
数据抽象层的原有开荒职员为您简介该抽象层,器重陈诉与 Oracle
一同运行的景观。

要求 PHP:5.0索要其余:Oracle 8 或越来越高版本客商端库下载用于 Oracle 的 PDO
:php_pdo.dll, php_pdo_oci.dll下载用于 Oracle 的 PDO :pdo, pdo_oci

PDO 简介

PHP
重假如由志愿者成功的门类;尽管有少数片段原则性的“主题”开采人士,但是我们并未有一人在专职受薪的开辟PHP。除此而外,大家分别放在世界分歧位置,您能够想像长时间开采的调弄收拾工作是怎么着劳碌。由此,PHP
主要是依赖痴心盘算的私人商品房短时间要求来升高的,其原因也数不胜数,有的是试验,有的则是因为“今天有活要交”。就算那样常常每一步都会修正PHP,但从深远来看则是缺失完整性 - 数据库扩大便是一个至关心珍视要的事例。

在各个差别的数量扩充(oci、mysql、postgresql、mssql
等)之间历来未曾真的的一致性,以致在一些意况下,在此些增加内部也从没当真的一致性。差十分的少全数那几个扩充都在选取与根底数据库
API
紧密相连的不等代码完毕着平等等级次序的职分。况兼因为大家的职员特别常有限,由此那就招致了代码越发难以维护,进而为
PHP 带给了相当的大的主题材料。

是因为 PHP 越来越受招待并不仅仅成功,因而根本 PHP
数据库扩充的跟随者们加入了在德意志举行的 LinuxTag 二零零四大会,在会上大家沟通了对 PHP 前途的理念。在座谈 PHP
发展的随机性时,我们鲜明了在 PHP 中进行数据库访谈的部分对象:

·提供一种轻型、清晰、方便的 API ·统一各样不相同 SportageDBMS
库的共有性格,但不免除更加尖端的特点。 ·通过 PHP
脚本提供可选的很大程度的悬空/宽容性。

我们因此建议了这种 PHP 数据对象 的定义,是因为我们期望通过接收 Zend
Engine 2进取的面向对象个性得到该 API 的部分更理想的性质。

PHP 中的数据抽象层概念一点都不能算新;在 Google 中询问“PHP database
abstraction”会找到大致 83,200 个相称项。它差不离是众多 PHP
开垦职员永世不忘的,而其产生则有的归因于我们破损的
API。假诺您曾经尝试过使用第三方抽象层来完结其余真正首要的做事,日常会开掘那些抽象层对于手头的行事以来设计的效劳过于强盛了

或许变现为在应用前必要实行大量就学,可能表现为接口速度放慢,参数要求经过多层脚本函数调用才干达到数据库自有的
API;平日是存在上述二种表象。

何以这一个抽象层会存在此种主题素材?这一个抽象层总是在总计达成太多的职责,甚至或然是不容许的职分。大家决定以实用为目的,仅将有个别最广大的数据库
API 本性作为大家的根基,并使得 PDO
驱动程序能够将它们特定于付加物的本性揭穿为平常扩张函数。

为什么使用 PDO?

听过关于数据库抽象扩大谣传的大比较多人会立马对 PDO 的强大方面发生困惑 -
大家是或不是要解析 SQL,将其转移为对应的后端方言呢?大家怎么着管理天性 X
或特色 Y,等等。由此,当您听别人讲大家在 PDO
中一向不用为此而焦躁时恐怕会大惊失色;我们不期望使具备内容都完全统一,因为要使得这种联合改为也许,只可以是将协和约束在低于的通用标准。

假使 PDO 不是多个完好的抽象层,那还或然有啥样别的原因值得您考虑使用它吧?

·品质。PDO 从一同先就吸收了现存数据库扩张成功和挫败的经历训诲。因为 PDO
的代码是全新的,所以大家有空子再一次起头设计性子,以利用 PHP 5
的风行天性。 ·才干。PDO 意在将遍布的数据库功能作为底工提供,相同的时间提供对于
RubiconDBMS 独特成效的福利访谈。 ·简单。PDO 意在使您能够轻巧使用数据库。API
不会狠毒到场您的代码,相同的时候会精晓地申明种种函数调用的经过。
·运维时可增加。PDO
扩充是模块化的,使您能够在运营时为你的数据库后端加载驱动程序,而无需再次编写翻译或重新安装整个
PHP 程序。举个例子,PDO_OCI 扩张会替代 PDO 增添达成 Oracle 数据库
API。还恐怕有一对用来 MySQL、PostgreSQL、ODBC 和 Firebird
的驱动程序,越来越多的驱动程序尚在开采。

您可能想通晓 PDO 与别的常用的抽象层的相比情形,举个例子 PEAXC60 DB 或
ADODB。无论在 API 方面或许在性质方面,PDO
都比其他大面积抽象层要轻型,然而关乎到在依次数据库后端之间提供统一性方面,则不及那些抽象层,比如用于拍卖多量可移植性难题的
PEA迈凯伦540C MDB 2 抽象层。

在哪个地方可以获取 PDO?

PDO 是经过 PECL,即 PHP 扩展库提供的。假如你在运维 Linux
Computer,请根据下边的印证进行设置;稍后是在 Windows 上安装的详细音讯。

请悉心,PDO
及其驱动程序当前居于“alpha”状态;这就代表大家会创建保险没有入眼劣点,可是该程序包作用并不完善-
大家还要加上非常多效果与利益。固然我们激励你测验该程序包,但是实际上不推荐在这个时候此刻将其用来生产。

Unix/Linux 安装

一经你从前未有尝试过 PHP 5,则请花一点岁月来通读一下“新闻”和种种表明。在
UNIX Computer上,您大概要设置或升高 libxml2;如果未有libxml2,“pear”程序包管理工科具就不能运营,您安装 PDO
时就能够越过不菲不方便。获取 PHP 5,并将其编写翻译和安装。确认保证钦点的前缀不是
/usr/local/,那样它就不会与 PHP 4 安装发生矛盾了:

% ./configure –prefix=/usr/local/php5 –with-zlib [那边钦命别的选项]%
make install

前些天您就足以接纳“pear”工具得到并安装 PDO 以致用于 PDO 的 Oracle
驱动程序了。因为 PDO 当前标识为 阿尔法,所以暗中同意情形下 pear
工具不会下载该程序包。在该程序包名称前面增多后缀“-阿尔法”,通告该 pear
工具得以设置 阿尔法 版本:

% PATH=”/usr/local/php5/bin:$PATH”% pear install PDO-alpha

您供给报告 PHP 从专项使用于 PHP 5 的 php.ini 文件加载 PDO
驱动程序。假设你使用的前缀与自家利用的相近,PHP 则会在
/usr/local/php5/lib/php.ini 中追寻 php.ini 文件。向该公文中加多以下行:

extension=pdo.so

明天您供给获得数据库特定的驱动程序;对于 Oracle,此特定程序名称叫PDO_OCI。在 shell 中,键入:

% pear install PDO_OCI-alpha

此驱动程序也急需从 php.ini 文件加载;将下行增添到前边增添的那行之后:

extension=pdo_oci.so

几日前检查一下,确认保障它亦可运转:

% php -m

在模块列表中,您应该探望到 PDO 和 PDO_OCI。

防火墙碍事了?

固然你身处防火墙的末端,则在行使 pear
安装程序获取程序包时也许会超越有的标题。如若暴发这种气象,则能够依照下列表明手动下载并设置那个程序包:

% wget pear install PDO-0.1.1.tgz

[ 将 extension=pdo.so 添加到 php.ini ]

% wget pear install PDO_OCI-0.1.tgz

[ 将 extension=pdo_oci.so 添加到 php.ini ]

新澳门萄京娱乐场,在上述二种情况下,都供给首先调用“pear
install”;上述示范中的版本号在本文编写之时是风靡的,但随着开荒的接轨扩充销会产生变化。

Windows 安装

一经你正在运作 Windows,则请依据下列表明实行:

·从 获取 PHP 5,将其解压缩到
C:\php5。 ·从
和 分获 PDO
和 PDO_OCI,将其放入 C:\php5\ext。可能,您能够从 PHP 5
下载页上列出的“用于 PHP 5.0.0 的 PECL 模块集合”zip 文件中找到全体这一个PDO 驱动程序,以至全体 PECL 程序包的享有 Windows 版本。 ·编辑
C:\php5\php.ini 文件,并累积下列内容:

extension=php_pdo.dllextension=php_pdo_oci.dll

编写制定 php.ini 文件时,有某个很关键,即要在任何其余 PDO 驱动程序早前先加载
PDO 扩大,不然就不能科学早先化。

譬如在 Windows 目录中有贰个 PHP 4 的全局 php.ini
文件,则恐怕会境遇难题。最佳的消除方法是,移动该 php.ini 文件,使其与
PHP 4 SAPI 坐落于同一的文书夹中,以割断 PHP 4 安装;比如,将其活动到与
php4apache.dll 肖似的公文夹中。请在乎,PHP 5
主次中不用全部文书档案都以新型的;推荐的设置进程如下面所述 - 如 install.txt
文件所证明的,请勿将别的 DLL 复制到 windows 文件夹或 system 文件夹中 -
任何内容都以自包括的。如果你运转的是 apache,何况境遇不能够加载 DLL
的不当,则检查一下是还是不是将 C:\php5 增加到了 PATH 中。别的,还要注意 PHP 5
的 CGI 版本今后的称谓为 php-cgi.exe。

连接 PDO

首先创立 PDO
类的叁个实例,将其看做数据库句柄。使用哪个底蕴驱动程序并不重大;您总要使用
PDO 类名。结构函数的首先个参数为数量源名称
,第三个参数为客户名,第五个参数为该顾客名的口令。DSN 的 PDO 命名惯例为
PDO
驱动程序的称谓,前边三个冒号,再后边是可选的驱动程序特定的消息。在我们的演示中,会加载
OCI
驱动程序但不点名其余其余音讯;那样会采用暗中认可的数据库。对于任何驱动程序,如
ODBC 驱动程序,第三个冒号前面包车型地铁装有内容都将被视作 ODBC DSN。MySQL
驱动程序会近似以分化的办法批注它的 DSN。

就算无法加载该驱动程序,恐怕产生了再三再四退步,则会抛出两个PDOException,以便你能够垄断如何最棒地管理该故障。

getMessage(); }?>

在接连字符串中,您可以内定八个可选参数;第二个是数据库名称,第叁个是字符集;那几个参数与可选的第1个和第多少个参数相对应,后五个参数您可能在
oci8 扩大函数 ociconnect
中选取过。要利用一定的字符集连接三个特定的数据库,则可以实行下列操作:

getMessage(); }?>

轻松易行 try..catch
调控构造并无益处。假如在应用程序的较高端别未有定义拾壹分处理,则在不能树立数据库连接的处境下,该脚本会终止。

连接管理

一时一刻,PDO 完全未有试行自个儿的任何连接管理,因而每一种“新
PDO”调用都会创立三个新的数据库连接。该连接在 $dbh
变量越界时,恐怕当您为其内定 NULL 值时会被保释。

getMessage(State of Qatar;exit; }// 在那处对数据库实践一些操作 // …//
今后实现,释放该连接$dbh = null;?>

陈设在不久的今后为 PDO 增添连接缓存效用;就当下的 oci8
扩充来讲,会引用与现存服务器的连天,并且在这里些连接中,还大概会援用闲置的记名。当在缓存连接情势中运作时,如上边的代码段所示释放
$dbh 时会将该登陆标识为可由别的连接重用。

假如您使用 ODBC 驱动程序访问 Oracle,则恐怕会很心仪地在乎到,默许情形下
PDO_ODBC 驱动程序支持 ODBC 连接池。

使用 PDO

询问三个编程 API
的最棒方法即是行使它,由此我们来看一下附带的这些演示,以询问怎么开展批次更新。

// Create a PDO database handle object// the ‘oci:’ string specifies
that the OCI driver should be used// you could use ‘oci:dbname=name’ to
specify the database name.// The second and third parameters are the
username and password respectively$dbh = new PDO(‘oci:’, ‘scott’,
‘tiger’);

// Create a test table to hold the data from
credits.csv$dbh->exec(“CREATE TABLE CREDITS (extension varchar,name
varchar;

// start a transaction$dbh->beginTransaction();

// prepare to insert a large quantitiy of data$stmt =
$dbh->prepare(“INSERT INTO CREDITS VALUES ;

// bind the inputs to php variables; specify that the data will be
strings// with a maximum length of 64
characters$stmt->bindParam(‘:extension’,$extension,PDO_PARAM_STR,
64);$stmt->bindParam(‘:name’, $name,PDO_PARAM_STR, 64);

// Open the .csv file for import$fp = fopen;while {list =
fgetcsv;$stmt->execute;

// Commit the changes$dbh->commit();

?>

既然如此大家早已打响总是到了
Oracle,那么今后就能够成立二个表来保存一些多少了。对于此示例,大家采用一些
PHP 扩充及其作者,并将那些内容输入二个数据库中。数据库句柄对象的 exec(卡塔尔国方法可用来发出不会再次来到结果集的长足一遍性查询,由此大家在这里间运用该办法来发生CREATE TABLE 查询。

为了使得示例更自然,作者从 PHP
源代码中收取了扩充及其笔者的消息,并将其累积到了叁个 CSV
文件中(请参见“相关附属类小零部件:credits.csv”)。那就象征三个左近景色:从 CSV
文件批次导入数据。在大家的演示中,大家充裕利用了 Oracle
的预管理语句和绑定参数,以博取三个连忙的数据导入脚本。在汇报该示例此前,有必不可缺掌握一下
PDO 处总管务的法子。

PDO 中的事务管理

Oracle
具备三个机智的暗许操作格局:当您举办延续时,将会放在一个隐式事务管理中,在付出业务早先在那之中的改观不会全盘奏效。除了事务管理的正统优点(原子性、一致性、隔离性、可长久性

ACID)之外,数据库服务器在推行每一趟换代之后还无需再行创设索引和此外内部布局;它能够延缓到提交之后进展。那样会加快代码的实践。Oracle
那一点实在很好。

但不幸的是,并不是各类数据库经销商都援助事务管理,何况因为 PDO
意在以一种周旋可移植的艺术协理那些事务处理,所以它暗中同意景况下以电动提交情势运作。启用自动提交形式后,数据库驱动程序会隐式提交每一个成功的立异。当你调用
$dbh->beginTransaction(卡塔尔(قطر‎ 时,就能呈请关闭自动提交,直到调用
$dbh->commit
才会再度启用,具体决定于你的代码是哪些编写的。假若根底驱动程序不辅助事务管理,则会抛出三个PDOException。

借使产生了难题还要 PHP
出错,您的本子将退出并且作业处于待批状态;大概你关闭数据库句柄时,PDO
会自动针对任何待批的政工资调解用
$dbh->rollBack(卡塔尔(قطر‎。此行为会裁减向数据库中付出或然未定义可能已破坏数据的或许性,那是用来拍卖已丢掉专门的学问的正经八百语义。

预管理语句、存储进程

PDO 帮助使用 Oracle 样式命名的占位符语法将变量帮定到 SQL
中的预管理语句(与 oci8 扩张中的 ocibindbyname。PDO
还为其余数据库提供了命名占位符模拟,以至足感觉生来就不支持该概念的数据库模拟预管理语句和绑定参数。那是
PHP 向前迈进的积极一步,因为如此能够使开采职员能够用 PHP
编写“集团级”的数据库应用程序,而不用专程关怀数据库平台的力量。

运用 PDO 预管理语句特别轻易,调用数据库句柄的 prepare()方法就可以。它会回去四个言语句柄对象,然后您可以接收该目标来绑定参数和执行语句。在这里示例中,大家将在定义三个命名占位符,“:extension”和“:name”,那四个占位符分别与
.CSV 文件中的 PHP 扩大名称和内部叁个小编的姓名相对应。

$stmt = $dbh->prepare(“INSERT INTO CREDITS VALUES ;

预管理了话语之后,大家接收 bindParam(卡塔尔 方法来将这一个命名参数分别与 PHP
变量名称“$extension”和“$name”相关联 相通)。大家还只怕会打招呼
Oracle,那么些数据就要格式化为字符串,最大尺寸为 64 个字符。

$stmt->bindParam(‘:extension’, $extension, PDO_PARAM_STR,
64);$stmt->bindParam(‘:name’, $name, PDO_PARAM_STR, 64);

大家前不久即计划好插入数据了 - 大家只须求开发该 CSV
文件,并从当中获取数据就可以。通过接收 fopen
函数能够一定轻巧地实现此操作。然后,大家得以应用 PHP list()布局函数直接将 CSV
的列钦点给变量“$extension”和“$name”。因为这几个变量已经绑定到了语句中,所以我们未来要做的只是调用该语句对象的
execute(卡塔尔 方法使其实行插入。这种艺术既方便又便捷 -
在事务管理时各类迭代循环唯有两行。达到文件尾时,大家就能够登时使用数据库句柄的
commit(State of Qatar 方法来交给这一个校勘了。

假如你只是要传递输入参数,何况有大多这么的参数要传送,那么您会感到下边所示的飞快方式语法特别有救助;此语法使您能够节约对
$stmt->bindParam(卡塔尔(قطر‎ 的调用。

$stmt = $dbh->prepare(“INSERT INTO CREDITS VALUES
;$stmt->execute(array(‘:extension’ => $extension, ‘:name’ =>
$name));

你还是能使用 bindParam
来为存储进程设置输入/输出参数;语法是完全雷同的,只是查询有所差别。上边包车型客车代码演示怎么着调用贰个名称叫“sp_add_item”的积存进程;其目标是要针对性输入设置
$item_name,然后该存款和储蓄进度就要回去时更新 $error_code。

$stmt = $dbh->prepare(“begin sp_add_item(:item_name,
:error_code); end”);$stmt->bindParam(‘:item_name’, $item_name,
PDO_PARAM_STR, 12);$stmt->bindParam(‘:error_code’, $error_code,
PDO_PARAM_STR, 12);$stmt->execute();

抓取数据

应用 PDO
抓取数据与张开扦插或更新相仿,只是你推行完询问之后,将在重复调用 fetch(卡塔尔方法来取得结果集的下一行。举行获取的最简便意况如下所示,值得注意的一些是,您还能够将参数绑定到查询,以调节如
WHERE 子句那样的剧情;试行此操作的语法与大家已经看见的 bindParam(卡塔尔国代码完全相近。

$stmt = $dbh->prepare(“SELECT extension, name from CREDITS”);if
{while {print_r; }}

PDO
帮助部分比不上的抓取计谋,这一个政策在方便性和属性方面具有差别;通过将下列选项之一钦定为
fetch(State of Qatar 方法的参数,您能够改换其再次来到值以适应您的语法:

·PDO_FETCH_NUM - 各种行抓取重临五个遵循列位置索引的数组,並且以 0
为基数。

while ($row = $stmt->fetch {printf(“Extension %s, by %s
“, $row[0], $row[1]);}

·PDO_FETCH_ASSOC -
每种行抓取依照行聚焦的列名,重回三个按列名索引的数组。

while ($row = $stmt->fetch {echo “Extension $row[EXTENSION] by
$row[NAME]
“;}

·PDO_FETCH_BOTH -
每种行抓取再次回到一个既坚决守护列地点又信守列名索引的数组。也正是上述三种情景的直接组合。若无一点名抓取形式,则该格局为暗中同意格局。
·PDO_FETCH_OBJ - 每种行抓取再次回到叁个无名对象,其属性名与列名对应。

while ($row = $stmt->fetch {echo “Extension {$row->EXTENSION} by
{$row->NAME}
“;}

·PDO_FETCH_LAZY -
各类行抓取重返三个引用语句对象的重载对象。那“看起来”好疑似PDO_FETCH_OBJ 和 PDO_FETCH_BOTH 的整合,只是独有当您在本子中拜谒 PHP
变量时才创设那个变量。 ·PDO_FETCH_BOUND - 抓取每行,再次回到TRUE。在利用绑定输出列时这种艺术要命有用,它能够幸免创制不供给的其它数组或对象。。

无论是你使用哪类抓取战术,当未有任何行可抓取时,fetch(State of Qatar 方法将会回去
FALSE。

现行小编要描述一些技术,要是你需求最终再调动一下剧天性能的话,这一个技术大概会对您抱有利于。但先给你一个忠告:要像走避瘟疫相像制止不成熟的优化。您应该总是首推最清楚、可维护性最佳的缓和方案。请深深记住,在二个独立的
Web
应用程序中,您无法掂量各样抓取方式间的区别,除非脚本要管理超多行。笔者再另行一次:抓取形式间的习性差别超小- 请使用最切合您代码的形式。

请记住,使用 PDO_FETCH_NUM
的花费比很小,因为访谈列数据只是叁个简便的数值查询。PDO_FETCH_OBJ
令你能够运用 OO
语法将数据集的列作为对象的质量来做客,可是各种属性访谈都涉及多个外加的散列查询,使得应用它的开销基本上与
PDO_FETCH_ASSOC 相通。每种那样的形式都会复制整行,进而占用稍多的内部存款和储蓄器。

不少数据库驱动程序都会表示你事情未发生前抓取并缓存一定数量的行。PHP
每回访问个中多少个如此行中的列时,它都亟需将其复制到自身的专项使用内存区域中。如若你的询问涉及众多行,而只需求依赖某种复杂的逻辑访谈给定行的特定列,则您会发觉
PDO_FETCH_LAZY
是一种幸免选择过多内部存款和储蓄器的实用方法,因为它唯有在您访谈给定列时才复制该列。使用此措施时要小心,从有些给定语句为每个fetch(卡塔尔国抓取的“惰性对象”是每便迭代时行使的同出一辙对象。那就暗暗提示着您不可能只是简短地囤积该对象用于今后的相比较,因为它依然会引用该语句的一时行
- 您须求手动复制所要求的部分。

最终一种方式为 PDO_FETCH_BOUND,该形式会告诉 PDO
您曾经将全部列绑定到了 PHP
变量,何况除了要它在到达行集的终极时通报你外无需它实践别的任何操作。绑定输出列在概念上与绑定输入参数雷同,只是绑定输出列能够用来全部数据库驱动程序。您能够将
PHP 变量绑定到命名列,PDO 就要每一遍调用 execute(State of Qatar时对其打开翻新。此技术可用来剃去结果聚集每列、每行的片段虚构机器操作码。这种才干的劣点在于,恐怕会令你的代码难以追踪,您使用变量名称时索要倍加小心。上面包车型客车代码表达了绑定输出列的使用。请留意,您不要钦命PDO_FETCH_BOUND 就可以使用 $stmt->bindColumn(卡塔尔;PDO_FETCH_BOUND
只是叁个对此你精晓只可以利用绑定值的动静的一种优化。

$stmt = $dbh->prepare(“SELECT extension, name from CREDITS”);if
{$stmt->bindColumn(‘EXTENSION’,
$extension);$stmt->bindColumn;while ($stmt->fetch {echo
“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->bindColumn(‘EXTENSION’,
$extension);$stmt->bindColumn;while ($stmt->fetch {echo
“Extension:$extension, Author:$name\n”; }}

除了 PDO_CASE_UPPER 之外,还有 PDO_CASE_LOWER和
PDO_CASE_NATURAL(它是暗许选项:使列保持数据库驱动程序再次来到的款式)。

不当和错误管理

可移植脚本的另叁个难点是拍卖从各类数据库管理程序重临的各个分歧的失实新闻;有些数据库对于程序化管理错误的扶持才能非常糟糕,而其余界分数据库则怀有特别丰硕的错误代码。只要可行,PDO
将为你的剧本提供叁个统一的错误代码,进而使您不要为应对可移植性的那么些上边所累。当然,PDO
还有可能会为驱动程序提供原生错误代码和谬误消息,防止您须要用它来拓宽确诊,只怕错误代码映射残破。

另八个劳神 PHP
数据库扩展的一致性难点是错误处理战略的一致性:有个别增加会再次回到的错误代码须求你手动抓取错误字符串,而别的一些恢宏则只是发生PHP 警报。PDO 允许你从下列三种区别的错误管理策略中精选一种:

·PDO_ERRMODE_SILENT那是暗许格局;它只是接受语句和数据库句柄对象的
errorCode 方法为您设置要反省的错误代码。

if {echo $dbh->errorCode() .”
“;$info = $dbh->errorInfo();// $info[0] == $dbh->errorCode()统一的错误代码// $info[1] 是驱动程序特定的荒明清码// $info[2]
是驱动程序特定的乖谬字符串}

·PDO_ERRMODE_WAWranglerNING除了设置错误代码之外,PDO 还有或然会时有产生 PHP
警报,您能够动用正规的 PHP
错误管理程序捕获该警报,并汇总选择您希图好用于应用程序的其余错误处理/记录战术,可能只是使该错误展现在浏览器中。
·PDO_ERRMODE_EXCEPTION除了设置错误代码之外,PDO 还恐怕会抛出八个PDOException,并将其属性设置为蕴涵该错误代码和音信。然后,您能够在代码的较高档别捕获该非常,使用全局十三分管理程序捕获该非常,大概不对其开展拍卖而停下脚本。

try {$dbh->exec;} catch {// 显示警报新闻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, trueState of Qatar;//
以后自此 $dbh 张开的任何语句中的// 空字符串都将被改造为 NULL

POD 的现状和今后

PDO
未来仍分外不成熟,可是会超级快成熟起来。在编排本文之时,笔者在本文中涉及的别的内容都能够由此PDO_OCI 驱动程序适用于 Oracle 8 或更加高版本(在 Oracle 8.0 和 9.2
上测验过)。

一度布置增加以下注重特点,在不久将得以应用:

1.用到 PHP 流的 LOB 扶助。
使用绑定参数,您能够将别的流动资金源(如文件、套接字、HTTP
能源、压缩/筛选的流)作为输入或输出参数字传送递到在 LOB
上运营的查询中。与之相同,类型为 LOB 的出口参数将表现为 PHP
流,由此你能够使用 fread 和其余流函数来访谈那个参数。此时,在 PDO
中平昔未有 LOB 帮衬。 2.长久性连接和缓存的预管理语句。
持久性连接使您能够幸免在种种页面命中时开荒和停业数据库服务器连接。缓存的预管理语句又发展了一步,它让你能够长久保持查询的预管理版本以致数据库句柄。
3.游标。 近些日子,PDO
只提供前向只读游标,可是以后会提供可滚动游标、REF-CU奥迪Q5SOENVISION、使用游标进行定位更新,甚至可更新滚动游标。

咱俩期望在 PHP 5.1 中暗中认可启用 PHP 扩张,但是早先,大家愿意能让 PDO
在 PHP 5.0
公布时稳固运转,可是大家日常职业中的压力微微推延了这个干活儿。同时,通过
PECL 宣布 PDO 使大家能够在采取难点报告时做出回答,并依照不一致于 PHP 5.0
发表时间表的时间表公布修复版本,由此你在 PHP 5.1 发布前就可以使用 PDO。

咱俩须求您的申报

万一您试用了
PDO,并且开掘了难点,请必得使用大家的失实跟踪软件将其报告给我们。假诺您使用的是
Oracle 驱动程序,则请使用此页:

如若您使用的是其他驱动程序,则请用其名称替换该 U本田CR-VL 中 PDO_OCI。

要是你使用 PDO
时遇见标题,恐怕针对少数特点存在难点,只怕持有特色乞求,请联系
pecl-dev@lists.php.net。假使您愿意,当然还足以平素沟通笔者,可是请介怀,笔者每日都会摄取多量有关 PHP
的电子邮件;您恐怕会意识只要首先与眼下的邮件列表联系会更加快获得回应。

———–关于小编Wez Furlong 是 Brain Room Ltd.
的本事老板,他在该公司不止利用 PHP 用于 Web 开荒,还将其当作 Linux 和
Windows 应用程序和系统的嵌入式脚本引擎。Wez 是 PHP
的着力开采人员,平常向 SQLite、COM/.Net、ActivePHP、mailparse 和 Streams
API 等投稿,他是 PECL 即 PHP 扩充社区库的“头儿”。他的问话公司的网页为

发表评论

电子邮件地址不会被公开。 必填项已用*标注