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

一名新 PHP 数据对象 (PDO卡塔尔数据抽象层的庐山面目目开垦人士为你简单介绍该抽象层,注重叙述与 Oracle
一齐运维的情景。

PDO(PHP Data
Object)扩充在PHP5中进入,PHP6中将暗中认可知用PDO连接数据库,全体非PDO扩大将会在PHP6被从扩展中移除。该增加提供PHP内置类
PDO来对数据库进行拜访,分化数据库使用同一的章程名,解决数据库连接不联合的主题素材。
自己是安排在windows下做开垦用的。
PDO的指标提供一种轻型、清晰、方便的 API统一种种差异 TiguanDBMS
库的共有本性,但不驱除更加高端的特色。
通过 PHP 脚本提供可选的很大程度的聊以自慰/宽容性。
PDO的风味:品质。PDO
从一开首就摄取了现存数据库增添成功和停业的经历教导。因为 PDO
的代码是斩新的,所以大家有空子再一次起初安顿天性,以使用 PHP 5
的摩登本性。
能力。
PDO 目的在于将大范围的数据库作用作为底工提供,同有的时候候提供对于 兰德猎豹CS6DBMS
独特功效的方便访问。
简单。
PDO 意在让你能够轻巧利用数据库。API
不会残忍参加您的代码,同时会知道地方统一规范明种种函数调用的长河。
运维时可扩充。

要求 PHP:5.0须求其余:Oracle 8 或更加高版本顾客端库下载用于 Oracle 的 PDO
(WindowsState of Qatar:php_pdo.dll, php_pdo_oci.dll下载用于 Oracle 的 PDO
(Unix卡塔尔国:pdo, pdo_oci

PDO
扩张是模块化的,使您能够在运营时为您的数据库后端加载驱动程序,而毋庸再一次编写翻译或重新安装整个
PHP 程序。举个例子,PDO_OCI 扩充会代替 PDO 扩大达成 Oracle 数据库
API。还应该有部分用于 MySQL、PostgreSQL、ODBC 和 Firebird
的驱动程序,越多的驱动程序尚在开荒。■

PDO 简介

安装PDO

PHP
首纵然由志愿者成功的花色;即使有些部分定位的“宗旨”开拓人士,可是大家从未一个人在专职受薪的开发PHP。除外,大家独家放在世界分裂地点,您能够想像长时间开采的和睦专门的学业是如何劳累。因此,PHP
首要是依据痴人说梦的私家短时间必要来发展的,其缘由也无所不包,有的是试验,有的则是因为“前不久有活要交”。即使那样平常每一步都会更改PHP,但从漫长来看则是贫乏完整性 - 数据库扩张正是多个最主要的例证。

本子必要:

在各个分歧的数量扩充之间历来没有真正的一致性,以致在一些情形下,在这里些增添内部也不曾当真的一致性。差不离具有那个扩展都在选拔与底蕴数据库
API
紧密相连的例外轮代理公司码完结着同等类其余义务。何况因为我们的人手非常轻易,因而那就招致了代码尤其不便有限帮助,进而为
PHP 带给了超大的难题。

php5.1以致随后版本的前后相继包里曾经带了;
php5.0.x则要到pecl.php.net下载,放到你的扩张库,正是PHP所在的文书夹的ext文件夹下;
手册上说5.0事情未发生前的版本无法运营PDO扩展。

鉴于 PHP 越来越受接待并不断成功,因而首要 PHP
数据库增添的维护者们列席了在德意志举行的 LinuxTag 贰零零零大会,在会上大家交换了对 PHP 前途的思想。在商讨 PHP
发展的随机性时,大家规定了在 PHP 中开展数据库访谈的局地指标:

配置(Windows):

・提供一种轻型、清晰、方便的 API ・统一各类分化 KugaDBMS
库的共有特性,但不拔除更加高档的风味。 ・通过 PHP
脚本提供可选的相当的大程度的抽象/宽容性。

修正你的php.ini配置文件,使它帮衬pdo.(php.ini那个东西一向不弄懂的话,先弄了然,要校勘调用你的phpinfo(卡塔尔函数所展现的不得了php.ini)

extension=php_pdo.dll前边的分行去掉,分毫是php配置文件注释符号,那么些扩大是必得的。

大家所以建议了这种 PHP 数据对象 (PDOState of Qatar 的定义,是因为大家期望由此动用
Zend Engine 2进取的面向对象性格获得该 API 的一些更加精良的习性。

往下还会有

PHP 中的数据抽象层概念一点都不能算新;在 Google 中查询“PHP database
abstraction”会找到大概 83,200 个相称项。它差不离是累累 PHP
开垦职员如痴如醉的,而其爆发则有的归因于大家不完全的
API。假设你已经尝试过使用第三方抽象层来成功其他真正关键的做事,平时会意识这几个抽象层对于手头的行事的话设计的效果过于强盛了

只怕表现为在利用前必要开展大批量学习,大概变现为接口速度放慢,参数需求通过多层脚本函数调用技术达到数据库自有的
API;平时是存在上述三种表象。

;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll

何以这个抽象层会存在此种主题素材?那几个抽象层总是在酌量实现太多的职务,以致大概是不容许的任务。大家决定以实用为目的,仅将有个别最广大的数据库
API 性情作为大家的底子,并使得 PDO
驱动程序能够将它们特定于付加物的表征揭穿为常规扩充函数。

找到extension=php_pdo.dll 和 extension=php_pdo_mysql.dll
,去掉后边“;”的注释,改善后的两行布置内容如下:

缘何选择 PDO?

extension=php_pdo.dll
extension=php_pdo_mysql.dll

听过有关数据库抽象增加谣传的大多数人会即时对 PDO 的扩张方面产生嫌疑 -
我们是不是要解析 SQL,将其退换为相应的后端方言呢?我们什么管理特性 X
或特色 Y,等等。因而,当你听闻大家在 PDO
中常常有毫无为此而令人顾忌时也许会吃惊;大家不指望使具有剧情都统统统一,因为要使得这种统一改为也许,只好是将和煦约束在低于的通用规范。

各各扩展所对应的数据库是:

假如 PDO 不是叁个全体的抽象层,那还会有啥其他原因值得您考虑接受它呢?

Driver name Supported databases
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x/4.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2

・品质。PDO 从一齐初就吸取了现存数据库扩张成功和倒闭的经历教训。因为 PDO
的代码是崭新的,所以大家有时机再次开端安插个性,以应用 PHP 5
的风靡本性。 ・工夫。PDO
目的在于将周围的数据库功用作为底工提供,同一时间提供对于 HavalDBMS
独特功用的有利访谈。 ・简单。PDO 目的在于令你能够轻便利用数据库。API
不会残酷参预您的代码,同期会知道地方统一标准明各类函数调用的经过。
・运营时可扩充。PDO
扩充是模块化的,令你可以在运作时为你的数据库后端加载驱动程序,而毋庸再一次编写翻译或重新安装整个
PHP 程序。比如,PDO_OCI 扩张会代替 PDO 扩张完结 Oracle 数据库
API。还或然有一对用以 MySQL、PostgreSQL、ODBC 和 Firebird
的驱动程序,更加多的驱动程序尚在支付。

你要动用哪类数据库,只要把相应的扩张前的笺注符号”;”去掉就可以了。

你或者想领悟 PDO 与其余常用的抽象层的对立统一情况,比方 PEATiguan DB 或
ADODB。无论在 API 方面恐怕在质量方面,PDO
都比别的大面积抽象层要轻型,但是涉及到在种种数据库后端之间提供统一性方面,则不比这几个抽象层,比方用于拍卖多量可移植性难题的
PEA奇骏 MDB 2 抽象层。

配置(Linux):

在何地能够收获 PDO?

编译PHP时加上:

PDO 是经过 PECL,即 PHP 扩展库提供的。借让你在运维 Linux
Computer,请依据上边的印证实行安装;稍后是在 Windows 上安装的详细消息。

–enable-pdo –with-pdo-sqlite
–with-pdo-mysql=/usr/local/mysql/bin/mysql_config

请小心,PDO
及其驱动程序当前居于“阿尔法”状态;那就意味着大家会面理保障未有入眼缺欠,然则该程序包功用并不完善-
我们还要加上超多意义。纵然大家激励你测量试验该程序包,不过实际上不引入在现阶段将其用来分娩。

重启apache或iis,搞三个测量检验页,里面就phpinfo函数,可查阅PDO模块是不是开启。

Unix/Linux 安装

采用PDO(Mysql 数据库譬喻)

借使您早先从未有过尝试过 PHP 5,则请花一点光阴来通读一下“信息”和各类证明。在
UNIX Computer上,您可能要设置或提高 libxml2;如果未有libxml2,“pear”程序包管理工科具就无法运营,您安装 PDO
时就能够遭遇很多困难。获取 PHP 5,并将其编写翻译和安装。确定保证钦点的前缀不是
/usr/local/,那样它就不会与 PHP 4 安装发生冲突了:

数据库的连年:

% ./configure –prefix=/usr/local/php5 –with-zlib [此间钦赐其余选项]%
make install

咱们经过上面包车型客车例子来解析PDO连接数据库,创设叁个 PDO_config.php
文件,使用的时候一向 include
一下:
<?php
//数据库类型 Oracle 用 OCI
,对于开垦者来讲,使用分歧的数据库只要改这些:
$dbms   = ‘mysql’;
$host   = ‘localhost’;
//数据库主机名
$dbName = ‘test_test_test’;
//使用的数据库
$user   = ‘root’;
//数据库连接客户名
$pass   = ‘ ‘;
//对应的密码
$dsn    = “$dbms:host=$host; dbname=$dbName”;

现今您就足以应用“pear”工具获得并安装 PDO 以至用于 PDO 的 Oracle
驱动程序了。因为 PDO 当前标识为 阿尔法,所以暗许情状下 pear
工具不会下载该程序包。在该程序包名称前边增加后缀“-阿尔法”,文告该 pear
工具得以安装 alpha 版本:

try{

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

//开头化三个PDO对象,正是成立了数据库连接对象 $dbh:
 $dbh = new PDO($dsn, $user, $pass);
//echo “连接成功<br/>”; /*您还足以进行三次寻觅操作
 foreach($dbh->query(‘SELECT
* from FOO’)as$row){
  print_r($row);
  //你能够用 echo($GLOBAL卡塔尔; 来见到那些值

您必要报告 PHP 从专用于 PHP 5 的 php.ini 文件加载 PDO
驱动程序。如若您使用的前缀与自己使用的完全一样,PHP 则会在
/usr/local/php5/lib/php.ini 中追寻 php.ini 文件。向该公文中加多以下行:

 }
 $dbh = null;
}catch(PDOException$e){
 die(“Error!: “.$e->getMessage().”<br/>”);
}
/*
暗中认可这几个不是长连接,假若供给多少库长连接,须求最后加一个参数:array(PDO::ATT昂Cora_PETiguanSISTENT
=> trueState of Qatar 产生那样:
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>true));
*/
$db = new PDO($dsn, $user, $pass);
//创制数据库连接对象 $db
?>

extension=pdo.so

数据库查询:

今昔您需求获得数据库特定的驱动程序;对于 Oracle,此特定程序名称为PDO_OCI。在 shell 中,键入:

地方我们早已开展了三回查询,大家还是可以够使用如下的查询:
<?php
include(“./PDO_config.php”);

% pear install PDO_OCI-alpha

$db -> setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);

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

//设置属性
$rs = $db->query(“SELECT * FROM yourtable”);
$rs -> setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs -> fetchAll();

extension=pdo_oci.so

//获取具有记录集到八个变量中
print_r($result_arr);

现行反革命检查一下,确认保障它能够运维:

?>

% php -m

上述因为用到setAttribute(卡塔尔国方法,放上那多少个参数,把字段名勉强转换到大写。

在模块列表中,您应该会看出 PDO 和 PDO_OCI。

上边列出多有PDO::setAttribute(State of Qatar的参数:

防火墙碍事了?

PDO::ATTR_CASE:
强制列名造成一种格式,详细如下(第三个参数卡塔尔:
PDO::CASE_LOWER
强制列名是小写.
PDO::CASE_NATURAL
列名依据原本的方式
PDO::CASE_UPPER
抑遏列名叫题写
PDO::ATTR_ERRMODE
荒谬提醒
PDO::ERRMODE_SILENT
不显得错误消息,只体现错误码
PDO::ERRMODE_WARNING
展现警报错误
PDO::ERRMODE_EXCEPTION
抛出特别
PDO::ATTR_ORACLE_NULLS(不止是ORACLE有效,其他数据库也实惠State of Qatar: )
点名数据库再次来到的NULL值在php中对应的数值
PDO::NULL_NATURAL:
不变.
PDO::NULL_EMPTY_STRING
Empty string is converted toNULL
PDO::NULL_TO_STRING
NULL is converted to an empty string
PDO::ATTR_STRINGIFY_FETCHES
Convert numeric values to strings when fetching. Requiresbool.
PDO::ATTR_STATEMENT_CLASS
Set user-supplied statement class derived from PDOStatement. Cannot be
used with persistent PDO instances. Requiresarray(string classname,
array(mixed constructor_args)).
PDO::ATTR_AUTOCOMMIT(available in OCI, Firebird and MySQL)
Whether to autocommit every single statement.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(available in MySQL)
Use buffered queries.

借让你身处防火墙的前边,则在行使 pear
安装程序获取程序包时恐怕会碰到一些难点。假诺产生这种气象,则足以依据下列表明手动下载并设置这几个程序包:

事例中的

% wget % pear install PDO-0.1.1.tgz

$rs->setFetchMode(PDO::FETCH_ASSOC);
是PDOStatement::setFetchMode(State of Qatar,对回到类型的宣示。

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

有如下:

% wget _OCI% pear install PDO_OCI-0.1.tgz

PDO::FETCH_ASSOC– 关联数组格局
PDO::FETCH_NUM — 数字索引数组方式
PDO::FETCH_BOTH — 两个数组格局都有,那是缺省的
PDO::FETCH_OBJ — 依据指标的款式,形似于以前的
mysql_fetch_object(卡塔尔国愈来愈多再次来到类型注脚(PDOStatement::方法名卡塔尔(قطر‎看手册。★插入,更新,删除数据,
$db->exec(”DELETE FROM `xxxx_menu` where
mid=43″卡塔尔(قطر‎;轻易的下结论一下下边包车型大巴操作:查询操作主假若PDO::query(卡塔尔(قطر‎、PDO::exec(State of Qatar、PDO::prepare(卡塔尔(قطر‎
PDO::query(卡塔尔国主假如用于有记录结果再次回到的操作,极度是SELECT操作,
PDO::exec(State of Qatar主借使指向性未有结果集结重回的操作,比方INSERT、UPDATE、DELETE等操作,它回到的结果是前段时间操作影响的列数。
PDO::prepare(卡塔尔国首假诺预管理操作,需求经过$rs->execute(卡塔尔来实行预管理当中的SQL语句,这些措施能够绑定参数,作用相比强硬,不是本文能够轻松说领悟的,我们能够仿效手册和其它文书档案。获取结果集操作主即使:PDOStatement::fetchColumn(卡塔尔(قطر‎、PDOStatement::fetch(State of QatarPDOStatement::fetchALL(卡塔尔(قطر‎。
PDOStatement::fetchColumn(State of Qatar是获取结果钦定第一条记下的某些字段,缺省是第四个字段。
PDOStatement::fetch(卡塔尔是用来获得一条记下,
PDOStatement::fetchAll(卡塔尔是获得具备记录集到壹在那之中,获取结果能够经过PDOStatement::setFetchMode来设置需要结果集合的体系。此外有三个科学普及的操作,多少个是PDO::lastInsertId(卡塔尔国和PDOStatement::rowCount(卡塔尔(قطر‎。PDO::lastInsertId(卡塔尔(قطر‎是再次回到上次布署操作,主键列类型是自增的最终的自增ID。
PDOStatement::rowCount(卡塔尔国首假设用来PDO::query(卡塔尔和PDO::prepare(卡塔尔国进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec(卡塔尔国方法和SELECT操作无效。
工作和自动提交至此,您曾经经过 PDO 连接到了
mysql,在发出查询此前,您应该了然 PDO
是如什么地方理作业的。如果在此之前从没接触过业务,那么首先要领悟事情的 4
个特征:原子性(Atomicity)、一致性(Consistency)、独立性(Isolation)和持久性(Durability),即
ACID。用外行人的话说,对于在一个作业中奉行的别的职业,固然它是分等第施行的,也一定能够确定保障该工作会安全地使用于数据库,而且在专业被交给时,不会遭到来自此外总是的影响。事务性职业能够依照诉求自动废除(倘若你还从未交到它),那使得脚本中的错误管理变得更加的便于。
事情经常是经过把一堆改善存款起来、使之同有的时候间生效而完成的。那样做的补益是足以大大提升这个立异的作用。换句话说,事务能够使脚本越来越快,而且可能更健壮(可是要求科学地应用职业技能得到这么的好处)。
不佳的是,并非种种数据库都帮衬专门的学业(Mysql5辅助专门的工作,mysql4自个儿不知情卡塔尔,所以当第3回张开连接时,PDO
供给在所谓的“自动提交(auto-commit)”方式下运作。自动提交形式代表,如果数据库辅助工作,那么你所运转的每一个询问都有它自个儿的隐式事务,若是数据库不协助职业,每种查询就平昔不比此的政工。假若您必要贰个工作,那么必须运用
PDO::beginTransaction()方法来运营二个作业。假如底层驱动程序不支持专门的职业,那么将会抛出一个PDOException(无论错误管理设置是怎么样的:那总是一个严重错误状态)。在一个事情中,可以利用
PDO::commit(卡塔尔(قطر‎ 或 PDO::rollBack(卡塔尔国来甘休该专门的学问,那取决事务中运转的代码是或不是中标。
当脚本甘休时,也许当二个连连将在被关门时,假若有二个未成功的事情,那么
PDO
将电动回滚该业务。那是一种安全措施,有支持制止在剧本非不荒谬截止时现身不相同样的景况——
若无显式地交给业务,那么假诺有有些地方会现出不等同,所以要施行回滚,以保险数据的安全性。

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

在上述二种情况下,都亟待首先调用“pear
install”;上述示范中的版本号在本文编写之时是风靡的,但随着开辟的三回九转开展会产生变化。

Windows 安装

假如您正在运行 Windows,则请依照下列表明实施:

・从 #v5 获取 PHP 5,将其解压缩到 C:/php5。 ・从 _5_0/php_pdo.dll
和_5_0/php_pdo_oci.dll 分别收获 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卡塔尔(قطر‎,第叁个参数为客户名,第四个参数为该顾客名的口令。DSN 的 PDO
命名惯例为 PDO
驱动程序的名称,前边八个冒号,再后边是可选的驱动程序特定的消息。在大家的示范中,会加载
OCI
驱动程序但不点名别的别的消息;那样会选取暗中认可的数据库。对于此外驱动程序,如
ODBC 驱动程序,第贰个冒号前边的兼具剧情都将被看成 ODBC DSN。MySQL
驱动程序会相像以差异的法门批注它的 DSN。

要是不可能加载该驱动程序,只怕发生了接二连三退步,则会抛出多少个PDOException,以便你能够垄断(monopoly卡塔尔国如何最佳地管理该故障。

?phptry {$dbh = new PDO(“OCI:”, “scott”, “tiger”);} catch (PDOException
$e) {echo “Failed to obtain database handle ” .$e-getMessage(); }?

在连续字符串中,您能够内定七个可选参数;第贰个是数据库名称,第一个是字符集;那几个参数与可选的第多少个和第多少个参数相对应,后八个参数您或然在
oci8 扩张函数 ociconnect(State of Qatar 或 ocip图标n(卡塔尔国中采用过。要采纳一定的字符集连接五个特定的数据库,则足以施行下列操作:

?phptry {$dbh = new PDO(“OCI:dbname=accounts;charset=UTF-8”, “scott”,
“tiger”);} catch (PDOException $e) {echo “Failed to obtain database
handle ” .$e-getMessage(); }?

差不离 try..catch
调整构造并无益处。假如在应用程序的较高端别未有概念非常管理,则在不可能树立数据库连接的事态下,该脚本会终止。

接连管理

一时,PDO 完全未有施行自己的任何连接管理,由此各种“新
PDO”调用都会创建八个新的数据库连接。该连接在 $dbh
变量越界时,也许当你为其钦赐 NULL 值时会被保释。

?phptry {$dbh = new PDO(“OCI:dbname=accounts;charset=UTF-8”, “scott”,
“tiger”卡塔尔;} catch (PDOException $e卡塔尔(قطر‎ {echo “Failed to obtain database
handle ” .$e-getMessage(卡塔尔(قطر‎;exit; }// 在此边对数据库实施一些操作 // …//
今后完毕,释放该连接$dbh = null;?

布署在不久的即日为 PDO 扩张连接缓存效用;就当下的 oci8
扩张来讲,会引用与现存服务器的连天,况兼在这里些连接中,还有恐怕会援用闲置的登入。当在缓存连接方式中运作时,如上边的代码段所示释放
$dbh 时会将该登入标志为可由其他总是重用。

一旦您使用 ODBC 驱动程序访谈 Oracle,则恐怕会很欢悦地专心到,私下认可情况下
PDO_ODBC 驱动程序援助 ODBC 连接池。

使用 PDO

询问一个编制程序 API
的最棒措施就是行使它,由此我们来看一下附带的这几个演示,以询问怎么进展批次更新(代码如下卡塔尔。

?php

// 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(255),name
varchar(255))”);

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

// prepare to insert a large quantitiy of data$stmt =
$dbh-prepare(“INSERT INTO CREDITS (extension, name) VALUES (:extension,
:name)”);

// 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(‘credits.csv’, ‘r’);while
(!feof($fp)) {list($extension, $name) = fgetcsv($fp,
1024);$stmt-execute();}fclose($fp);

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

?

既是大家早已打响总是到了
Oracle,那么以往就能够创立贰个表来保存一些数额了。对于此示例,我们采取部分
PHP 扩展及其作者,并将那一个内容输入一个数据库中。数据库句柄对象的 exec(卡塔尔(قطر‎方法可用来爆发不会重临结果集的高速一次性查询,由此大家在那运用该措施来发出
CREATE TABLE 查询。

为了使得示例更自然,作者从 PHP
源代码中收取了扩充及其笔者的消息,并将其积存到了一个 CSV
文件中。那就表示两个听而不闻境况:从 CSV
文件批次导入数据。在我们的亲自过问中,大家充足利用了 Oracle
的预管理语句和绑定参数,以获取二个便捷的多寡导入脚本。在呈报该示例早先,有必要领会一下
PDO 处管事人务的措施。

PDO 中的事务处理

Oracle
具备八个机警的暗中认可操作格局:当您实行接二连三时,将会放在三个隐式事务管理中,在提交业务在此之前当中的转移不会全盘奏效。除了事务管理的正经八百优点之外,数据库服务器在进行每一遍换代之后还无需重新构建索引和其余内部构造;它能够推迟到提交未来打开。那样会加速代码的试行。Oracle
那一点真正很好。

但不幸的是,并非每一种数据库供应商都支持事务管理,并且因为 PDO
意在以一种相对可移植的法子扶植这几个事务处理,所以它暗中同意境况下以机关提交情势运营。启用自动提交格局后,数据库驱动程序会隐式提交各样成功的换代。当您调用
$dbh-beginTransaction(卡塔尔 时,就能呈请关闭自动提交,直到调用 $dbh-commit()也许 $dbh-rollBack(State of Qatar才会重新启用,具体决计于你的代码是如何编写的。假使底蕴驱动程序不援助事务管理,则会抛出二个PDOException。

假使爆发了难点同期 PHP
出错,您的剧本将脱离並且作业处于待批状态;或然您关闭数据库句柄时,PDO
会自动针对其余待批的事务调用
$dbh-rollBack(卡塔尔国。此行为会优惠扣向数据库中付出恐怕未定义大概已破坏数据的恐怕性,那是用以拍卖已废弃专门的学业的正规语义。

预管理语句、存款和储蓄进度

PDO 援救使用 Oracle 样式命名的占位符语法将变量帮定到 SQL
中的预处理语句。PDO
还为别的数据库提供了命名占位符模拟,以致足感到生来就不协助该概念的数据库模拟预管理语句和绑定参数。那是
PHP 向前迈进的能动一步,因为这么可以使开垦职员能够用 PHP
编写“公司级”的数据库应用程序,而毋庸专程关切数据库平台的力量。

使用 PDO 预管理语句特别轻便,调用数据库句柄的 prepare(卡塔尔方法就可以。它会回来二个言语句柄对象,然后你能够利用该目的来绑定参数和实施语句。在这示例中,大家就要定义五个命名占位符,“:extension”和“:name”,那七个占位符分别与
.CSV 文件中的 PHP 增添名称和里面叁个笔者的姓名绝对应。

$stmt = $dbh-prepare(“INSERT INTO CREDITS (extension, name) VALUES
(:extension, :name)”);

预管理了讲话之后,我们接收 bindParam(卡塔尔国 方法来将那么些命名参数分别与 PHP
变量名称“$extension”和“$name”相关联。大家还大概会通报
Oracle,那么些多上校要格式化为字符串,最大尺寸为 64 个字符。

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

我们后天即希图好插入数据了 - 我们只须要开荒该 CSV
文件,并从当中获取数据就能够。通过选择 fopen(卡塔尔国 和 fgetcsv()函数能够一定轻松地达成此操作。然后,咱们得以行使 PHP list(卡塔尔国布局函数直接将 CSV
的列内定给变量“$extension”和“$name”。因为这么些变量已经绑定到了语句中,所以我们现在要做的只是调用该语句对象的
execute(卡塔尔国 方法使其实践插入。这种方法既方便又飞快 -
在事务管理时各样迭代循环独有两行。到Dawen件尾时,我们就足以马上使用数据库句柄的
commit(State of Qatar 方法来交给那些改换了。

一旦您只是要传送输入参数,并且有超多那样的参数要传送,那么您会感到上面所示的神速形式语法非常常有赞助;此语法让你能够节约对
$stmt-bindParam(卡塔尔(قطر‎ 的调用。

$stmt = $dbh-prepare(“INSERT INTO CREDITS (extension, name) VALUES
(:extension, :name)”);$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
($stmt-execute()) {while ($row = stmt-fetch()) {print_r($row); }}

PDO
扶植部分莫衷一是的抓取攻略,这么些攻略在方便性和总体性方面享有差异;通过将下列选项之一钦命为
fetch(卡塔尔 方法的参数,您能够更动其再次回到值以适应您的语法:

・PDO_FETCH_NUM - 每种行抓取再次回到三个遵纪守法列地方索引的数组,並且以 0
为基数。

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

・PDO_FETCH_ASSOC -
每一种行抓取依照行集中的列名,再次来到三个按列名索引的数组。

while ($row = $stmt-fetch(PDO_FETCH_ASSOC)) {echo “Extension
$row[EXTENSION] by $row[NAME]br”;}

・PDO_FETCH_BOTH -
各样行抓取再次回到一个既遵从列地方又如约列名索引的数组。也正是上述三种情形的第一手组合。若无一些名抓取格局,则该形式为暗中同意形式。
・PDO_FETCH_OBJ - 种种行抓取重回贰个无名对象,其属性名与列名对应。

while ($row = $stmt-fetch(PDO_FETCH_ASSOC)) {echo “Extension
{$row-EXTENSION} by {$row-NAME}br”;}

・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-execute()) {$stmt-bindColumn(‘EXTENSION’,
$extension);$stmt-bindColumn(‘NAME’, $name);while
($stmt-fetch(PDO_FETCH_BOUND)) {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-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(State of Qatar 和 errorInfo(卡塔尔国 方法为你设置要反省的错误代码。

if (!$dbh-exec($sql)) {echo $dbh-errorCode() .”BR”;$info =
$dbh-errorInfo();// $info[0] == $dbh-errorCode(卡塔尔(قطر‎ 统一的大谬不然代码//
$info[1] 是驱动程序特定的失实代码// $info[2]
是驱动程序特定的荒唐字符串}

・PDO_ERRMODE_WAMorganPlus 8NING除了设置错误代码之外,PDO 还有恐怕会生出 PHP
警示,您可以动用正规的 PHP
错误管理程序捕获该警示,并汇总选用您希图好用于应用程序的其他错误处理/记录攻略,只怕只是使该错误展现在浏览器中。
・PDO_ERRMODE_EXCEPTION除了安装错误代码之外,PDO 还会抛出一个PDOException,并将其质量设置为含有该错误代码和音信。然后,您能够在代码的较高等别捕获该特别,使用全局十二分管理程序捕获该特别,也许不对其开展处理而终止脚本。

try {$dbh-exec($sql卡塔尔国;} catch (PDOException $eState of Qatar {// 显示警报新闻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 或更加高版本。

曾经安顿扩展以下珍视特色,在不久将得以应用:

1.行使 PHP 流的 LOB 协助。
使用绑定参数,您能够将其它流动资金源作为输入或输出参数传递到在 LOB
上运维的查询中。与之相近,类型为 LOB 的出口参数将表现为 PHP
流,因而你能够动用 fread(卡塔尔(قطر‎、fwrite(卡塔尔(قطر‎、fseek(卡塔尔(قطر‎和其他流函数来访谈那么些参数。这个时候,在 PDO 中平昔未曾 LOB 协助。
2.长久性连接和缓存的预处理语句。
持久性连接令你可防止止在每种页面命中时展开和关闭数据库服务器连接。缓存的预管理语句又发展了一步,它使您能够长久保持查询的预管理版本以致数据库句柄。
3.游标。 近年来,PDO
只提供前向只读游标,不过未来会提供可滚动游标、REF-CURAV4SOLacrosse、使用游标举行牢固更新,以至可更新滚动游标。

我们希望在 PHP 5.1 中暗中认可启用 PHP 扩大,不过早先,大家盼望能让 PDO
在 PHP 5.0
公布时牢固运营,可是大家日常职业中的压力稍微拖延了这么些干活儿。相同的时候,通过
PECL 揭橥 PDO 使大家能够在收到难题报告时做出回应,并基于分裂于 PHP 5.0
发表时间表的时间表公布修复版本,由此你在 PHP 5.1 发表前就可以使用 PDO。

大家须要您的反馈

比如您试用了
PDO,并且开采了难题,请必需使用大家的谬误追踪软件将其报告给我们。借令你使用的是
Oracle 驱动程序,则请使用此页:

_OCI

假若你使用的是其它驱动程序,则请用其名称替换该 U君越L 中 PDO_OCI。

假定你使用 PDO
时相遇问题,可能针对某个特点存在疑问,可能具备特色恳求,请联系
pecl-dev@lists.php.net。纵然您愿意,当然还能直接挂钩笔者(wez@php.netState of Qatar,可是请介怀,作者天天都会吸收接纳多量关于 PHP
的电子邮件;您大概会意识只要首先与日前的邮件列表联系会越来越快获得答复。

———–关于我Wez Furlong 是 Brain Room Ltd.
的技术COO,他在该公司不但利用 PHP 用于 Web 开荒,还将其视作 Linux 和
Windows 应用程序和种类的嵌入式脚本引擎。Wez 是 PHP
的中坚开拓职员,平日向 SQLite、COM/.Net、ActivePHP、mailparse 和 Streams
API 等投稿,他是 PECL 即 PHP 扩展社区库的“头儿”。他的发问公司的网页为 。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图