Oracle PDO Driver (PDO_OCI)
安装
If the Oracle Database is on the same machine as PHP, the database software already contains the necessary libraries. When PHP is on a different machine, use the free » Oracle Instant Client libraries. For details refer to the OCI8 Requirements section.
PHP 8.4
此扩展已被移至 » PECL 资源库;不再与 PHP 捆绑,从 PHP 8.4.0
安装此 PECL 扩展相关的信息可在手册中标题为 PECL 扩展的安装章节中找到。更多信息如新的发行版本、下载、源文件、 维护人员信息及变更日志等,都在此处: » https://pecl.php.net/package/PDO_OCI.
PHP < 8.4
Use --with-pdo-oci[=DIR] to install
the PDO Oracle OCI extension, where the optional [=DIR]
is the Oracle Home directory. [=DIR]
defaults to
the $ORACLE_HOME environment variable.
Use --with-pdo-oci=instantclient,prefix,version for an Oracle Instant Client SDK, where prefix and version are configured.
// 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) -
Provides a way to specify the action on the database session.
自以下版本起 PHP 7.2.16 and 7.3.3
-
PDO::OCI_ATTR_CLIENT_INFO
(int) -
Provides a way to specify the client info on the database session.
自以下版本起 PHP 7.2.16 and 7.3.3
-
PDO::OCI_ATTR_CLIENT_IDENTIFIER
(int) -
Provides a way to specify the client identifier on the database session.
自以下版本起 PHP 7.2.16 and 7.3.3
-
PDO::OCI_ATTR_MODULE
(int) -
Provides a way to specify the module on the database session.
自以下版本起 PHP 7.2.16 and 7.3.3
目录
- PDO_OCI DSN — Connecting to Oracle databases
用户贡献的备注 7 notes
An important hint: if you are using prebuilt PHP packages where PDO_OCI is not compiled in, you should download the original PHP sources for the PHP version your server is using.
These sources contain the PDO_OCI source in the ext/pdo_oci directory.
Change to that directory, build the module using
phpize
./configure
make
and then install the newly build module to your PHP extension directory and add it to your configuration.
For me this has worked on a Debian server with the sury.org modules (PHP 8.2).
if oracle and oracle instant client has been installed,
without db in the same host
For UNIX/LINUX,set $LD_LIBRARY_PATH
appent your instant client path and client/lib path to it,
For windows set PATH like this
After set the path ,set TNS_ADMIN everioment ,point to
where tnsnames.ora located.
Then,you can use service name to connect to your Database
Test coding
<?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')");
?>
If you're getting the "I'm too dumb to find oci.h" error, try creating a variety of paths. One variety uses just the major and minor of your OIC version (eg, 11.2 for 11.2.0.2) and another variety uses client64 as well as client.
Something like this (for 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
This should cover your bases for 64-bit systems, as well as PHP patched to use the major.minor version number only. See also PHP bug #44989.
To enable PDO support on PHP for Oracle Instant Client 11.1.x, you should follow the syntax above in the compile command, just as pointed by Andrew http://bugs.php.net/bug.php?id=39312, taking by default you have installed the OIC at /usr/lib/oracle (instant client and sdk at subfolder):
./configure --with-oci8=shared,instantclient,/usr/lib/oracle
--with-pdo-oci=instantclient,/usr/lib/oracle,11.1
Just saying your release version from the Oracle OIC.
It compiles fine then.
Best regards.
Take note of the note at the top, this really is an experimental extension. I had a problem trying to read data from Oracle which resulted in some strange behaviour in PHP. i.e. foreach loops not ending, with no error messages. I also managed to get the data from Oracle into an array in PHP, but then couldn't return the array from a function.
After pulling my hair out for a day, it turned out to be a CLOB column in Oracle that caused the strange behaviour in PHP. I assume this extension doesn't fully support them.
Instead I've typecast it within the SQL to a VARCHAR2 which seems to resolve it:
SELECT CAST(columnx AS VARCHAR2(4000)) AS columnx ...
It might help someone else having similar issues.
A Statement of Warning:
PDO::oci does not support REF CURSORS.
This is mentioned nowhere (until now!) on this page.
And now you know!
If you want ref cursors avoid PDO for now.
My Reference for this claim:
http://www.oracle.com/technology/pub/articles/
php_experts/otn_pdo_oracle5.html
GREAT article, excellent piece, really. It's not clear to me
how old this document is, but it must have some dust on it,
given it's references to "PHP5.1 ...' which is a little way off yet' "
... as of 2006-06-01, PHP5.1 has been with us for quite some time.
Notice the red block at the beginning of this page... pdo_oci is HIGHLY experimental.
Even though it is under dev from 2004, it lakes today support for things that _do_ matters :
- bind a varchar2 of 3500 chars
- get selected metas
- left join with blobs/clobs
- etc.
For the story, since we use pdo_pgsql in our software, I thought it would be viable to use pdo_oci for running under Oracle. After a long battle, I finally won :
1) If requested driver has a non-experimental pdo version available, use it.
2) else (well, for pdo_oci at least), use an abstraction layer of your own.
3) you're done.
What I did in more details...
2 "main" classes for being compliant with "$obj instanceof PDO" or such :
- class PhpDb extends PDO
- class PhpDbStatement extends PDOStatement
2 "abstract" classes that defines what PDO actually does :
- abstract class PhpDbAbstract
- abstract class PhpDbAbstractStatement
And at last for each driver, 2 classes doing the abstraction :
- class PhpDbDriverOracle extends PhpDbAbstract
- class PhpDbDriverOracleStatement extends PhpDbAbstractStatement
"main" classes are accessed from your script, simply replace "new PDO" with "new PhpDb".
"abstract" classes are mainly there for the documentation :p
"driver" classes do the job in background, they are instances by the main classes.
My PhpDb will be in an open source project sooner or later, search google or mail me !