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

问题描述:

最近几天我一直在努力让PHP连接到oracle数据库。我一直使用安装在窗口机器上的MAMP堆栈(它可用于Windows并确保为我们团队制定统一的开发堆栈)。经过与OCI8安装相关的常见问题的努力后,我终于用phpinfo()显示以下信息OCI8 PHP info section即使function_exists('oci_connect')返回true,为什么oci_connect()会抛出一个“未定义的函数”异常?

我也可以看到它是使用php -m命令安装的模块,使用PHP的OCI8 --ri命令,可以找到从 Oracle即时客户端使用已安装的DLL文件,其中OCI *

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

我有没有设置ORACLE_HOME,TNS_ADMIN或其他Oracle变量与即时客户端库(我的理解)

我已经注释掉了的extension_dir线和延长= php_oci8_12c.dll在不需要这些php.ini文件并确认我一直在编辑正确的文件。

我已经在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 
+0

首先说了,欢迎SO!现在,你有没有尝试重新启动服务器? “尝试sudo服务apache2重启”但这不是你的问题。问题是你正在调用没有参数的obi_connect!尝试阅读文档:0)https://doc.bccnsoft.com/docs/php-docs-7-en/function.oci-connect.html –

+0

哦,我会DEFIANTLY改写问题,后阅读此:https ://*.com/help/how-to-ask这样做将会为你节省很多来自社区的悲痛。他们可能会有时无情,靠口头禅生活“愚蠢的问题会得到愚蠢的答案”。你的问题不是愚蠢的,但确实需要......修改。 –

+0

尝试加载(通过浏览器)调用phpinfo()的PHP脚本。您可能会发现OCI8丢失。我怀疑你的Web服务器环境与命令行环境不同:可能Oracle客户端库不在PATH中。 –

要调用oci_connect()不带参数输出。

传递的用户名和密码为你的数据库的功能,如documentation

+0

-1。 PHP不能这样工作。调用不带参数的'oci_connect'应该导致:'警告:oci_connect()需要至少2个参数,0给出在''中。这表明'oci8'模块已经加载并正在工作,但是您在如何调用函数时犯了一个错误。 – timclutton

+0

没错,我忘记了。我刚刚删除了答案的那一部分 –