PHP 大会日本 2024

Oracle 函数 (PDO_OCI)

安装

如果 Oracle 数据库与 PHP 在同一台机器上,则数据库软件已包含必要的库。当 PHP 在不同的机器上时,请使用免费的 » Oracle Instant Client 库。有关详细信息,请参阅 OCI8 需求 部分。

PHP 8.4

从 PHP 8.4.0 开始,此扩展已移至 » PECL 存储库,不再与 PHP 捆绑在一起。

有关安装此 PECL 扩展的信息,可以在名为 安装 PECL 扩展 的手册章节中找到。其他信息(如新版本、下载、源文件、维护者信息和更改日志)可以在此处找到: » https://pecl.php.net/package/PDO_OCI

PHP < 8.4

使用 --with-pdo-oci[=DIR] 安装 PDO Oracle OCI 扩展,其中可选的 [=DIR] 是 Oracle 主目录。 [=DIR] 默认为 $ORACLE_HOME 环境变量。

对于 Oracle Instant Client SDK,使用 --with-pdo-oci=instantclient,prefix,version,其中配置了前缀和版本。

// Using $ORACLE_HOME
$ ./configure --with-pdo-oci

// Using OIC for Linux with 10.2.0.3 RPMs with a /usr prefix
$ ./configure --with-pdo-oci=instantclient,/usr,10.2.0.3

预定义常量

以下常量由此驱动程序定义,并且仅在将扩展编译到 PHP 中或在运行时动态加载时才可用。此外,仅当您使用此驱动程序时,才应使用这些特定于驱动程序的常量。将特定于驱动程序的属性与另一个驱动程序一起使用可能会导致意外行为。PDO::getAttribute() 可用于获取 PDO::ATTR_DRIVER_NAME 属性以检查驱动程序,如果您的代码可以针对多个驱动程序运行。

PDO::OCI_ATTR_ACTION (int)

提供了一种指定数据库会话上操作的方法。

这从 PHP 7.2.16 和 7.3.3 开始存在。

PDO::OCI_ATTR_CLIENT_INFO (int)

提供了一种指定数据库会话上客户端信息的方法。

这从 PHP 7.2.16 和 7.3.3 开始存在。

PDO::OCI_ATTR_CLIENT_IDENTIFIER (int)

提供了一种指定数据库会话上客户端标识符的方法。

这从 PHP 7.2.16 和 7.3.3 开始存在。

PDO::OCI_ATTR_MODULE (int)

提供了一种指定数据库会话上模块的方法。

这从 PHP 7.2.16 和 7.3.3 开始存在。

内容目录

添加注释

用户贡献的注释 7 条注释

Wolfgang Riedmann
1 年前
一个重要的提示:如果您使用的是未编译 PDO_OCI 的预构建 PHP 包,则应下载服务器正在使用的 PHP 版本的原始 PHP 源代码。
这些源代码在 ext/pdo_oci 目录中包含 PDO_OCI 源代码。
更改到该目录,使用以下命令构建模块
phpize
./configure
make
然后将新构建的模块安装到您的 PHP 扩展目录并将其添加到您的配置中。
对我来说,这在使用 sury.org 模块(PHP 8.2)的 Debian 服务器上运行良好。
cursade at hotmail dot com
18 年前
如果已安装 oracle 和 oracle instant client,
并且数据库不在同一主机上

对于 UNIX/LINUX,设置 $LD_LIBRARY_PATH
将您的 instant client 路径和 client/lib 路径附加到其中,

对于 windows,请按如下方式设置 PATH

设置路径后,设置 TNS_ADMIN 环境变量,指向
tnsnames.ora 所在的位置。

然后,您可以使用服务名称连接到您的数据库

测试代码

<?php
$param
= $_POST;
$db_username = "youusername";
$db_password = "yourpassword";
$db = "oci:dbname=yoursid";
$conn = new PDO($db,$db_username,$db_password);
$name = $param['module'];
$file = $param['file'];
$stmt = $conn->exec("INSERT INTO AL_MODULE (AL_MODULENAME, AL_MODULEFILE) VALUES ('$name', '$file')");

?>
php at ideacode dot com
13 年前
如果您遇到“我太笨了,找不到 oci.h”错误,请尝试创建各种路径。一种方法只使用您的 OIC 版本的主版本和次版本(例如,11.2 代表 11.2.0.2),另一种方法使用 client64 以及 client。

例如(对于 11.2.0.2)
ln -s /usr/include/oracle/11.2.0.2/ /usr/include/oracle/11.2
ln -s /usr/include/oracle/11.2/client /usr/include/oracle/11.2/client64
ln -s /usr/lib/oracle/11.2.0.2/ /usr/lib/oracle/11.2
ln -s /usr/lib/oracle/11.2/client /usr/lib/oracle/11.2/client64

这应该涵盖 64 位系统以及修补为仅使用主版本和次版本号的 PHP。另请参见 PHP 错误 #44989。
fernando dot wendt at gmail dot com
15 年前
要为 Oracle Instant Client 11.1.x 上的 PHP 启用 PDO 支持,您应该按照上述语法在编译命令中进行操作,就像 Andrew 指出的那样 http://bugs.php.net/bug.php?id=39312, 默认情况下,您已将 OIC 安装在 /usr/lib/oracle(instant client 和 sdk 在子文件夹中)

./configure --with-oci8=shared,instantclient,/usr/lib/oracle
--with-pdo-oci=instantclient,/usr/lib/oracle,11.1

只需说明您来自 Oracle OIC 的发行版本。

然后它可以正常编译。

此致。
redlorry919 at gmail dot com
13 年前
请注意顶部的注释,这确实是一个实验性扩展。我在尝试从 Oracle 读取数据时遇到了问题,导致 PHP 中出现了一些奇怪的行为。即 foreach 循环没有结束,没有任何错误消息。我还设法将 Oracle 中的数据放入 PHP 中的数组中,但随后无法从函数中返回该数组。

在折腾了一天后,事实证明是 Oracle 中的 CLOB 列导致了 PHP 中的奇怪行为。我假设此扩展不完全支持它们。

相反,我在 SQL 中将其类型转换为 VARCHAR2,这似乎解决了问题

SELECT CAST(columnx AS VARCHAR2(4000)) AS columnx ...

它可能有助于遇到类似问题的其他人。
moc.aciremi@yvelj
18 年前
警告声明

PDO::oci 不支持 REF 游标。

在此页面上(直到现在!)都没有提到这一点。

现在你知道啦!

如果您想要 ref 游标,暂时避免使用 PDO。

我对此声明的参考
http://www.oracle.com/technology/pub/articles/
php_experts/otn_pdo_oracle5.html

精彩的文章,极好的作品,真的。我不清楚
此文档有多旧,但它上面一定沾满了灰尘,
因为它引用了“PHP5.1 ...' which is a little way off yet' ”
...截至 2006 年 6 月 1 日,PHP5.1 已经存在了一段时间了。
geompse at gmail dot com
14 年前
请注意此页面开头的红色块... pdo_oci 处于高度实验阶段。

即使它从 2004 年就开始开发,但今天它仍然缺乏对一些重要事物的支持
- 绑定 3500 个字符的 varchar2
- 获取选定的元数据
- 使用 blob/clob 进行左连接
- 等等。

对于这个故事,由于我们在软件中使用了 pdo_pgsql,我想到使用 pdo_oci 在 Oracle 下运行是可行的。经过一番努力,我最终成功了。

1) 如果请求的驱动程序有可用的非实验性 pdo 版本,则使用它。
2) 否则(至少对于 pdo_oci 而言),使用您自己的抽象层。
3) 就完成了。

我更详细地做了什么……

2 个“主要”类,用于符合“$obj instanceof PDO”或类似情况
- class PhpDb extends PDO
- class PhpDbStatement extends PDOStatement
2 个“抽象”类,定义了 PDO 实际执行的操作
- abstract class PhpDbAbstract
- abstract class PhpDbAbstractStatement
最后,对于每个驱动程序,有两个类进行抽象
- class PhpDbDriverOracle extends PhpDbAbstract
- class PhpDbDriverOracleStatement extends PhpDbAbstractStatement

“主要”类可从您的脚本访问,只需将“new PDO”替换为“new PhpDb”。
“抽象”类主要用于文档说明 :p
“驱动程序”类在后台执行工作,它们是由主要类实例化的。

我的 PhpDb 迟早会加入一个开源项目,请搜索谷歌或给我发邮件!
To Top