如何用PHP7在Windows上配置远程连接Oracle数据库
项目需求,需要定期去另一个项目组的Oracle数据库获取一些数据,在本地配置如何连接Oracle,第一步是在Windows上配置又经历了一个坑,终于配置完成了。在这里分享一下,希望对有需要的人有帮助。
1。首先验证给定的只读帐户是否可以成功连接。您需要在本地安装连接工具(PLSQL Developer)
2。要管理PLSQL Developer连接,需要下载即时客户端oracle工具(instantclient_11_2)并定义一个文件A,用于存储连接数据库的信息并将其放置在工具目录中。
Oracle客户端必须与Oracle版本一致(一般不一致也可以)。我问DBA,这里是什么版本的,去Oracle官网下载合适的客户端,因为本地的phpstudy包含的php都是32位版本的。我担心可能有问题,所以下载了一个与PHP版本相同位数的客户端(64位电脑系统,所以与此无关)。
解压客户端放在一个目录下,新建一个放在客户端文件夹的子目录下。
输入以下内容
test_db= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = IP)(PORT =1521)) ) (CONNECT_DATA = (SERVICE_NAME = dbname) ) )
test_db是你自己给的连接名称,将IP替换为远程oracle IP,service_name中输入数据库名称。
将客户端目录添加到路径中以方便连接到 PLSQL Developer。
添加ORACLE_HOME系统变量来存储客户端目录。
添加NLS_lANG系统变量并保存为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,解决编码读取问题。
安装好PLSQL Developer后,连接看看是否可以连接。
3。从 php 启用 oci 扩展或 pdo_oci 扩展并测试连接。
因为php7没有php_oci_11g扩展,所以必须自己安装,下载合适版本的dll文件,放到php ext目录下,运行扩展。
打开后可能会出现 Windows 中丢失的文件。
现在,将上述客户端中的文件复制到php目录中。
启动php并查看PHPinfo。应出现以下扩展:
尝试连接到数据库
try{ // $conn = new PDO("oci:dbname=//IP:1521/dbname",'username','password');// PDO方式 $conn = oci_connect('username','password',"(DEscriptION=(ADDRESS=(PROTOCOL =TCP)(HOST=IP)(PORT = 1521))(CONNECT_DATA =(SID=dbname)))"); var_dump($conn); echo "连接成功"; }catch(PDOException $e){ echo ("Error:".$e->getMessage()); }
- PDO 方法将引发以下异常 (SQLSTATE[]: pdo_oci_handle_factory: (ext\pdo_oci\) 2017-03-08+ 1). 在 Windows 中。既然您确定已经安装了该扩展,那么它可能不是 PHP 错误或其他任何东西(我见过一些人向 PHP 官方报告错误)。
有人说把所有dll文件复制到system32或者全部复制到php等等。首先,不建议复制任何东西到c盘目录下。乱七八糟,因为功能小就把文件放进去肯定是荒唐的。只需将其放在您需要的地方即可。
和上面缺少的文件一样,因为是php使用的,所以php会在自己的目录下寻找该文件,只放到php目录下(当然也可以放到system32下)
由于配置时间比较长,我有点累了,所以就把所有的Client文件复制到php目录下。测试中不再出现上述错误,证明是缺少上述文件之一造成的。我这里想要的是nginx + phpcgi。此时,如果你把刚刚复制到php目录下的文件删除,其中有一些文件如果用到的话肯定是删除不了的。尝试后,只有后面的文件和以前的文件无法删除。
这个文件的另一个特点是体积非常大,并且有很多功能扩展等等。
现在已经完成了,尝试上面的PHP代码:
- 表单PDO打印连接类型(object(PDO)#1(0){
}) - 正常连接返回连接类型(资源(5) )类型(oci8连接))
总结:
不要相信答案,每次都将其复制到system32,并将所有文件放在某个地方。这会导致系统目录混乱,你将无法找到它。问题虽然解决了,但是思路不清晰,可能会莫名其妙的自行解决(其实也没用)
补充:
使用PHP连接数据库时,来自Oracle的数据库名称必须配置sid,而不是数据库名称。这两者有些配置是不同的,一定要注意,否则无法连接。
- 表单PDO打印连接类型(object(PDO)#1(0){
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。