zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

跳坑成功,手摸手带你使用PHP连接Oracle数据库

OraclePHP数据库连接 成功 使用
2023-09-11 14:19:17 时间

看起来挺奇怪的,为啥是PHPOracle呢,一般不是PHPMysql吗,他们俩才是黄金搭档啊🤣,一切都源于免费啊~,Oracle数据库是免费薅来的,俗话说不用白不用🤩,既然有这个资源就像怎么利用起来,然后就开始整,因为网络上的文章都是老的,已经不适用于新版本的数据库和PHP版本了,结果遇到了很多坑,经过一周的跳坑终于成功上岸,特此记录✌️

1. Linux版

  • 服务器:CentOS7
  • PHP版本:V7.4.3
  • Oracle数据库版本:19c

1.1 安装oracle客户端

首先去Oracle官网下载三个包到电脑本地,下载链接:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

  • oracle-instantclient-devel-21.1.0.0.0-1.x86_64.rpm
  • oracle-instantclient-basic-21.1.0.0.0-1.x86_64.rpm
  • oracle-instantclient-sqlplus-21.1.0.0.0-1.x86_64.rpm

将这三个包上传到/usr/lib/oracle目录下(oracle文件夹为新建文件夹),进入文件夹执行安装命令:

$ rpm -ivh oracle-instantclient-*

添加环境变量,并保存:

$ vim /etc/profile
# 在尾部增加如下内容
export ORACLE_HOME=/usr/lib/oracle/21/client64
export ORACLE_BASE=/usr/lib/oracle/21
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH

保存退出后执行以下命令后使环境变量生效:

$ source /etc/profile

🔔 注意:安装oci8和pdo_oci扩展都需要进行这第一步

1.2 安装oci8扩展

因编译安装经常报各种错误,这里推荐使用pecl安装:

$ export PHP_DTRACE=yes
$ pecl install oci8-2.2.0
# 输入路径
instantclient,/usr/lib/oracle/21/client64/lib

🔔 若报错 Cannot find sys/sdt.h which is required for DTrace support
执行安装:yum install systemtap-sdt-devel

看到以下信息表示安装扩展成功:

Build process completed successfully
Installing '/usr/lib64/php/modules/oci8.so'
install ok: channel://pecl.php.net/oci8-2.2.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=oci8.so" to php.ini

php.ini中增加扩展引入extension=oci8.so

$ vi /etc/php.ini
# 添加 
extension=oci8.so
# 验证是否成功
$ php -m | grep oci8
# 出现oci8表示安装成功
oci8
# 需要修改下/usr/lib64/php/modules/oci8.so 文件权限755

1.3 安装pdo_oci扩展

vi /etc/ld.so.conf  
# 加入此行,保存退出
/usr/lib/oracle/21/client64/lib/     

建立软连接,如果安装oci8扩展时,已经建立过,跳过即可

ln -s /usr/lib/oracle/21/client64 /usr/lib/oracle/21/client  
ln -s /usr/include/oracle/21/client64 /usr/include/oracle/21/client

去PHP官方下载php-7.4.19.tar.gz压缩文件,解压后将pdo_oci文件夹放到服务器的php扩展目录中:cd /usr/include/php/ext,然后执行下面的命令:

# 执行下方命令,编译安装处理,类似oci8安装
$ cd /usr/include/php/ext/pdo_oci
$ /usr/bin/phpize
$ ./configure --with-pdo-oci=instantclient,/usr/lib/oracle/21/client64/lib \
            --with-oci8=instantclient,/usr/lib/oracle/21/client64/lib
$ make && make install

添加pdo_oci扩展:

$ vi /etc/php.d/pdo_oci.ini  # pdo_oci.ini是新建的
$ extension=/usr/lib64/php/modules/pdo_oci.so  # 此处为pdo_oci.so的全路径,在编译后有展示

重启PHP服务:

systemctl restart httpd
systemctl restart php-fpm

1.4 测试PHP连接Oracle数据库

首先准备连接文件,在oracle数据库下载 oralce wallet 文件,这个在Oracle数据库后台管理里面下载,解压出来一般有以下文件:
在这里插入图片描述
将文件夹放到服务器的一个目录里(🔔注意保密哦),这里我放在/usr/lib/oracle/Wallet_videoplatform2,然后PHP测试代码如下:

<?php 

// tnsnames.ora 信息里拼接数据库连接信息(照着拼就行了)
$dbstr ="tcps://adb.ap-seoul-1.oraclecloud.com:1522/ge815e794bb3bb9_xxxxxxxxx_high.adb.oraclecloud.com?wallet_location=/usr/lib/oracle/Wallet_videoplatform2";

$dbconn = oci_connect('用户名','密码',$dbstr);

if($dbconn!=false)
{
    echo "连接成功".'<br/>';
    if(OCILogOff($dbconn)==true)
    {
        echo "关闭连接成功!".'<br/>';//
    }
}
else
{
    echo "连接失败".'<br/>';
}

echo phpinfo();

🔔 若出现 ORA-12546: TNS:permission denied 错误执行以下语句即可:
setsebool -P httpd_can_network_connect on

访问页面,结果:
在这里插入图片描述
终于连接成功了!✌️

2. Windows版

2.1 安装OCI8

PHP7 需要选择 2.2.0 版本的oci,根据自己的PHP版本自行选择版本:

下载链接:https://pecl.php.net/package/oci8/2.2.0/windows

可以先通过查看phpinfo()PHP Extension Build 栏位查看,我的PHP是NTS版的,所以下载oci也要是NTS版的。
在这里插入图片描述
下载完后,将解压的文件,拷贝到PHP扩展目录php7.4.3nts\ext下覆盖原文件,扩展目录在php.iniextension_dir = xxxxxx指定。

2.2 安装Oracle Client客户端

Oracle Instant Client 是一组可轻松安装的免费库,允许程序连接到本地或远程 Oracle 数据库实例。

  1. 首先下载oracle客户端 Oracle 官方客户端下载 我这里下的是 instantclient-basic-windows.x64-19.11.0.0.0dbru.zip 版本。
  2. 将软件包解压缩到单个目录中,例如 D:\oracle\instantclient_19_11
  3. 将此目录添加到PATH环境变量。如果您安装了多个版本的Oracle库,请确保新目录首先出现在路径中。重新启动任何终端窗口,否则请确保您的应用程序使用了新的PATH

下载完后里面有oci.dll这个文件,当启动了php的扩展后,找的也就是这个 oracle 文件。那php 怎么找这个dll呢,加系统环境变量即可。

然后修改php.ini配置文件:

# 去除前面的分号;开启扩展,若没有就添加
extension=pdo_oci
extension=php_oci8.dll

最后,重启 Apache 即可。

查看是否安装成功,可以用 cmd 命令行查看是否已成功安装oci8扩展,如成功安装则显示以下信息:
在这里插入图片描述
也可在phpinfo()中查看扩展信息:
在这里插入图片描述
在这里插入图片描述

2.3 测试PHP连接Oracle数据库

首先准备连接文件,在oracle数据库下载 oralce wallet 文件,解压出来一般有以下文件:
在这里插入图片描述
将文件放到本地的一个目录里,这里我放在D:\oracle\Wallet_videoplatform2,然后测试代码:

<?php 

// tnsnames.ora 信息里拼接数据库连接信息(照着拼就行了)
$dbstr ="tcps://adb.ap-seoul-1.oraclecloud.com:1522/xxxxx_videoplatform2_high.adb.oraclecloud.com?wallet_location=D:\oracle\Wallet_videoplatform2";

$conn = oci_connect('ADMIN','xxxxxxx',$dbstr);


if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// 查询并渲染
$stid = oci_parse($conn, 'SELECT * FROM users');
$r = oci_execute($stid);
print "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    print "<tr>\n";
    foreach ($row as $item) {
        print "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "</td>\n";
    }
    print "</tr>\n";
}
print "</table>\n";
oci_free_statement($stid);

访问数据库成功,页面显示数据:
在这里插入图片描述

3. 总结

每个人都可能是第一个吃螃蟹的人,如果你有机会遇到了,不要怕,把握机会,拼一下有可能就尝到了甜头。

爬坑不易,点赞支持下🌹

PS:有童鞋想知道怎么获取永久免费的服务器和永久免费数据库私信我,偷偷告诉你哟 😏