为什么oci_connect()抛出一个"未定义的函数"即使function_exists(' oci_connect')返回true也会出现异常?

时间:2017-06-06 20:44:03

标签: php database oracle php-7 oci8

过去几天我一直在努力让PHP连接到oracle DB。我一直在使用安装在窗口机器上的MAMP堆栈(它可用于Windows并确保我们团队的统一开发堆栈)。在努力解决与OCI8安装相关的常见问题后,我终于在phpinfo()中显示了以下信息OCI8 PHP info section

我也可以使用php -m命令将其视为已安装的模块,使用php --ri oci8命令的选项,并且可以从中找到已安装的dll文件 oracle即时客户端使用oci *

它似乎已安装,我有一个链接到即时客户端文件夹的PATH变量。除了在MAMP日志文件中调用未定义函数之外没有错误。

我没有设置ORACLE_HOME,TNS_ADMIN或其他oracle变量,因为即时客户端库不需要它们(我的理解)

我已经取消注释了php.ini文件中extension_dir和extension = php_oci8_12c.dll的行,并确认我一直在编辑正确的文件。

我在index.php文件中运行了一个简单的php脚本,其中包含以下行

<?php
    If(function_exists('oci_connect')){
      echo 'oci_connect exists';
      $conn = oci_connect();
    }
?>

这是一个简单的测试,应该给我一个警告,抱怨不正确的参数,但脚本的输出是

oci_connect exists Fatal error: Uncaught Error: Call to undefined function oci_connect() in C:\MAMP\htdocs\Oracle_Connection\index.php:16 Stack trace: #0 {main} thrown in C:\MAMP\htdocs\Oracle_Connection\index.php on line 16

关于可能出错的问题,我已经用完了,没有关于设置OCI8功能的文档似乎都遇到了这个问题。

欢迎任何帮助。 感谢

cmd的输出

C:\Users\geoff>php -m
[PHP Modules]
bcmath
calendar
com_dotnet
Core
ctype
date
dom
filter
hash
iconv
json
libxml
mcrypt
mysqlnd
oci8
odbc
openssl
pcre
PDO
pdo_mysql
Phar
Reflection
session
SimpleXML
soap
sockets
SPL
standard
tidy
tokenizer
wddx
xml
xmlreader
xmlwriter
zip
zlib
[Zend Modules]

C:\Users\geoff>php function_exists
Could not open input file: function_exists

C:\Users\geoff>php --ri oci8

oci8

OCI8 Support => enabled
OCI8 DTrace Support => disabled
OCI8 Version => 2.1.4
Revision => $Id: 03698b2e9b50593039b7ca292b2e3cf9eaf064b9 $
Oracle Run-time Client Library Version => 12.2.0.1.0
Oracle Compile-time Instant Client Version => 12.1

Directive => Local Value => Master Value
oci8.max_persistent => -1 => -1
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20
oci8.default_prefetch => 100 => 100
oci8.old_oci_close_semantics => Off => Off
oci8.connection_class => no value => no value
oci8.events => Off => Off

Statistics =>
Active Persistent Connections => 0
Active Connections => 0

C:\Users\geoff>where oci*
C:\Oracle\instantclient_12_2\oci.dll
C:\Oracle\instantclient_12_2\oci.sym
C:\Oracle\instantclient_12_2\ocijdbc12.dll
C:\Oracle\instantclient_12_2\ocijdbc12.sym
C:\Oracle\instantclient_12_2\ociw32.dll
C:\Oracle\instantclient_12_2\ociw32.sym

1 个答案:

答案 0 :(得分:0)

您正在呼叫oci_connect(),没有参数。

将数据库的用户名和密码传递给documentation

中所述的功能