美高梅平台下载-美高梅娱乐平台登录

热门关键词: 美高梅平台下载,美高梅娱乐平台登录

在数据库预编译代码执行的时候出现差异,oci.

日期:2020-04-19编辑作者:美高梅平台下载

一名新 PHP 数据对象 数据抽象层的原始开发人员为您简要介绍该抽象层,重点讲述与 Oracle 一起运行的情况。

介绍
今天发现php5.1.*和php5.2.*在数据库预编译代码执行的时候出现差异。
预编译优点
1.使用占位符,避免逐字输入数据到SQL中。自动处理引号和反斜线等字符的转义——增加安全性。
2.预先“准备”一条语句,然后在每次执行时绑定不同值达到重用的目的。——常用于以后被多次执行的语句。
3.可读性强。

需要 PHP:5.0需要其他:Oracle 8 或更高版本客户端库下载用于 Oracle 的 PDO :php_pdo.dll, php_pdo_oci.dll下载用于 Oracle 的 PDO :pdo, pdo_oci

代码
数据库连接代码都一样.
复制代码 代码如下:
$protol = 'mysql:host=localhost;dbname=test';
$username = 'monty';
$passwd = '0818';
$dbh = new PDO($protol, $username, $passwd);

PDO 简介

以下是一些测试。注意里面的SQL和for或者foreach语句!
测试1(用key值进行绑定)
复制代码 代码如下:
$stmt = $dbh->prepare('select * from t1 where name=:name');
$params = array();
$params['name'] = 'rentao';
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;

PHP 主要是由志愿者完成的项目;尽管有少数一些固定的“核心”开发人员,但是我们没有一个人在全职受薪的开发 PHP。除此之外,我们分别位于世界不同地方,您可以想象长期开发的协调工作是何等困难。因此,PHP 主要是基于突发奇想的个人短期需求来发展的,其原因也多种多样,有的是试验,有的则是因为“明天有活要交”。尽管这样通常每一步都会改善 PHP,但从长远来看则是缺乏完整性 - 数据库扩展就是一个重要的例子。

结论:

在各种不同的数据扩展(oci、mysql、postgresql、mssql 等)之间根本没有真正的一致性,甚至在某些情况下,在这些扩展内部也没有真正的一致性。几乎所有这些扩展都在使用与基础数据库 API 紧密相连的不同代码完成着相同种类的任务。而且因为我们的人手非常有限,因此这就造成了代码更加难以维护,从而为 PHP 带来了很大的问题。

PHP 5.1.*

由于 PHP 越来越受欢迎并不断成功,因此主要 PHP 数据库扩展的维护者们参加了在德国举行的 LinuxTag 2003 大会,在会上我们交换了对 PHP 前景的看法。在讨论 PHP 发展的随机性时,我们确定了在 PHP 中进行数据库访问的一些目标:

PHP 5.2.*

·提供一种轻型、清晰、方便的 API ·统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。 ·通过 PHP 脚本提供可选的较大程度的抽象/兼容性。

执行正常

我们之所以提出了这种 PHP 数据对象 的概念,是因为我们希望通过采用 Zend Engine 2先进的面向对象特性获得该 API 的一些更优秀的性能。

执行正常

PHP 中的数据抽象层概念一点都算不上新;在 Google 中查询“PHP database abstraction”会找到大约 83,200 个匹配项。它几乎是许多 PHP 开发人员梦寐以求的,而其产生则部分归因于我们不完整的 API。如果您曾经尝试过使用第三方抽象层来完成任何真正重要的工作,通常会发现这些抽象层对于手头的工作来说设计的功能过于强大了 - 或者表现为在使用前需要进行大量学习,或者表现为接口速度缓慢,参数需要经过多层脚本函数调用才能到达数据库自有的 API;通常是存在上述两种表象。

$params['name'] = 'rentao' 和$params[':name']='rentao'这两个都能执行,说明不受“:”限制。

为什么这些抽象层会存在这种问题?这些抽象层总是在试图完成太多的任务,甚至可能是不可能的任务。我们决定以实用为目标,仅将一些最常见的数据库 API 特性作为我们的基础,并使得 PDO 驱动程序能够将它们特定于产品的特性暴露为常规扩展函数。

测试2(数字下标去绑定,但是绑定的起始参数是1)——":key"在php5.2.*上不能用数字下标绑定

为什么使用 PDO?

复制代码 代码如下:
$stmt = $dbh->prepare('select * from t1 where name=:name limit 2');
$params = array();
$params[] = 'rentao';// 这里加不加":"都能成功执行

听过有关数据库抽象扩展谣传的大多数人会立刻对 PDO 的扩展方面产生疑惑 - 我们是否要分析 SQL,将其转换为相应的后端方言呢?我们如何处理特性 X 或特性 Y,等等。因此,当您听说我们在 PDO 中根本不用为此而担忧时可能会大吃一惊;我们不希望使所有内容都完全统一,因为要使得这种统一成为可能,只能是将自己限制在最低的通用标准。

for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
echo "HERE1n";
$stmt->execute();
echo "HERE2n";

如果 PDO 不是一个整体的抽象层,那还有什么别的原因值得您考虑使用它吗?

$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;

·性能。PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。 ·能力。PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。 ·简单。PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。 ·运行时可扩展。PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 Oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。

结论:

您可能想了解 PDO 与其他常用的抽象层的对比情况,例如 PEAR DB 或 ADODB。无论在 API 方面还是在性能方面,PDO 都比其他常见抽象层要轻型,但是涉及到在各个数据库后端之间提供统一性方面,则不如那些抽象层,例如用于处理大量可移植性问题的 PEAR MDB 2 抽象层。

php 5.1.*

在哪里可以获得 PDO?

PHP 5.2.*

PDO 是通过 PECL,即 PHP 扩展库提供的。如果您在运行 Linux 计算机,请按照下面的说明进行设置;稍后是在 Windows 上安装的详细信息。

执行正常

请注意,PDO 及其驱动程序当前处于“alpha”状态;这就意味着我们会合理保证没有重大缺陷,但是该程序包功能并不完善 - 我们还要添加很多功能。虽然我们鼓励您测试该程序包,但是实在不推荐在现阶段将其用于生产。

出现错误:“PHP Warning:  PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined”

Unix/Linux 安装

如果把":name"改成"?",那么两个版本都可以顺利进行。

如果您以前尚未尝试过 PHP 5,则请花一点时间来通读一下“新闻”和各种声明。在 UNIX 计算机上,您可能要安装或升级 libxml2;如果没有 libxml2,“pear”程序包管理工具就无法运行,您安装 PDO 时就会遇到很多困难。获取 PHP 5,并将其编译和安装。确保指定的前缀不是 /usr/local/,这样它就不会与 PHP 4 安装发生冲突了:

不能同时使用两种符号。如 select * from t2 where name=? limit :page

% ./configure --prefix=/usr/local/php5 --with-zlib [此处指定其他选项]% make install

测试3(limit绑定:page)
复制代码 代码如下:$stmt = $dbh->prepare('select * from t2 where name=:name limit :page');
$params = array();
$params['name'] = 'rentao';// 这里加不加":"都能成功执行
$params['page'] = 2;
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
echo "HERE1n";
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
echo "HERE2n";
$stmt = null;
$dbh = null;

现在您就可以使用“pear”工具获取并安装 PDO 以及用于 PDO 的 Oracle 驱动程序了。因为 PDO 当前标记为 alpha,所以默认情况下 pear 工具不会下载该程序包。在该程序包名称后面添加后缀“-alpha”,通知该 pear 工具可以安装 alpha 版本:

结论:

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

PHP 5.1.* PHP 5.2.*
执行到$stmt->execute()时,进程一直处于等待状态中 执行正常:打印不出结果

您需要告知 PHP 从专用于 PHP 5 的 php.ini 文件加载 PDO 驱动程序。如果您使用的前缀与我使用的一样,PHP 则会在 /usr/local/php5/lib/php.ini 中查找 php.ini 文件。向该文件中添加以下行:

测试4(在limit下进行预编译操作:page)——使用“?”机制运行
复制代码 代码如下:
$stmt = $dbh->prepare('select * from t2 where name=? limit ?');
$params = array();
$params[] = 'rentao';
$params[] = 2;
for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;

extension=pdo.so

PHP 5.1.* PHP 5.2.*
执行正常 执行正常:打印不出结果

现在您需要获取数据库特定的驱动程序;对于 Oracle,此特定程序称为 PDO_OCI。在 shell 中,键入:

测试5---order by)

% pear install PDO_OCI-alpha

PHP 5.1.* PHP 5.2.*
打印出结果,但未按order by进行排序 执行正常:打印不出结果

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

总结
PHP在使用PDO做数据库预编译操作的时候,尽量避免使用limit, order by, group by 做预编译处理。绑定变量我们尽量使用统一标准,要不然都使用“?”,要不然使用“:key”。

extension=pdo_oci.so

有用的命令,我在php5.1.*进行测试,测试完了,我通过scp把文件传输到php5.2.*服务器上
复制代码 代码如下:scp -P9888 index.php rentao@192.168.10.4:/home/rentao

现在检查一下,确保它能够运行:

% 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:php5ext。或者,您可以从 PHP 5 下载页上列出的“用于 PHP 5.0.0 的 PECL 模块集合”zip 文件中找到所有这些 PDO 驱动程序,以及所有 PECL 程序包的所有 Windows 版本。 ·编辑 C:php5php.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(); }?>

在连接字符串中,您可以指定两个可选参数;第一个是数据库名称,第二个是字符集;这些参数与可选的第三个和第四个参数相对应,后两个参数您可能在 oci8 扩展函数 ociconnect 中使用过。要使用特定的字符集连接一个特定的数据库,则可以执行下列操作:

getMessage(); }?>

省略 try..catch 控制结构并无裨益。如果在应用程序的较高级别没有定义异常处理,则在无法建立数据库连接的情况下,该脚本会终止。

连接管理

目前,PDO 完全没有执行自己的任何连接管理,因此每个“新 PDO”调用都会建立一个新的数据库连接。该连接在 $dbh 变量越界时,或者当您为其指定 NULL 值时会被释放。

getMessage();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();

?>

本文由美高梅平台下载发布于美高梅平台下载,转载请注明出处:在数据库预编译代码执行的时候出现差异,oci.

关键词:

LOB是用来存储大量的二进制和文本数据的一种数

PHP,即“PHP: Hypertext Preprocessor”,是一种广泛用于 OpenSource并可以嵌入 HTML 的多用途脚本语言。它的语法接近 C、Jav...

详细>>

实现离线消息池,聊天应用程序是最能体现 Nod

Redis 实现每个连接websocket的服务都唯一绑定一个用户。通过 用户账号 =websocket fd 存到redis中。        聊天是最典型...

详细>>

此宏会将当前文件名、行号和给定消息添加到每

1. 数据供给器 Google C++单元测试框架GoogleTest---AdvancedGuide(译文)下,advancediqtest 因为AdvancedGuide文档太长,分上下两部...

详细>>

美高梅平台下载:encode进行进行编码即可得到

PHP对Base64的支持非常好,有内置的base64_encode与base64_decode负责图片的Base64编码与解码。 编码上,只要将图片流读取到...

详细>>