调用未定义函数 oci_connect()
Posted
技术标签:
【中文标题】调用未定义函数 oci_connect()【英文标题】:Call to undefined function oci_connect() 【发布时间】:2022-01-24 02:53:18 【问题描述】:我收到了这个错误。
Fatal error: Call to undefined function oci_connect()
$conn = oci_connect('localhost', 'username', 'password') or die(could not connect:'.oci_error)
那是代码。
这是我得到的错误。
Fatal error: Call to undefined function oci_connect() in C:\xampp\htdocs\org\org\php\myphp.php on line 51
我检查了 ext 文件夹中的 PHP DLL 文件。
有人在此问题上提供帮助,在此先感谢。
【问题讨论】:
php.net/manual/en/oci8.installation.php 如果一切都失败了,请在这里尝试我的答案:***.com/questions/14646007/… 【参考方案1】:我只是花了整整三天的时间来解决这个问题。
我在 Windows 7 中使用我的 ORACLE 连接,没有问题。上周我刚买了一台装有 Windows 8 的新电脑。安装 XAMPP 1.8.2。此服务器上的每个应用程序 PHP/mysql 都可以正常工作。当我尝试将我的 php 应用程序连接到 Oracle DB 时,问题就出现了。
调用未定义函数 oci_pconnect()
当我启动/停止 Apache 并进行更改时,“PHP 启动”上出现一个奇怪的“警告”,并显示“PHP 警告:PHP 启动:第 0 行未知”
我做了所有事情(未注释的 php_oci8.dll 和 php_oci8_11g.dll,将 oci.dll 复制到 /ext 目录,靠近 /Apache 并且没有任何工作。下载 Instant Client 的每个版本,但没有任何工作。
上帝帮助了我。当我下载 ORACLE Instant Client 32 位时,一切正常。 phpinfo() 显示 oci8 信息,我的应用程序运行良好。
所以,请不要介意您的 WINDOWS 版本是 x64。 XAMPP 和 ORACLE Instant Client 之间的链接。
【讨论】:
我也有这个问题...我在 Windows 7 64 位上,刚刚意识到我安装了 64 位版本的 Oracle XE 11.2 并且我安装了 32 位即时客户端。 ..也许这是我的问题(所有这些都必须是 32 位才能协同工作吗?)您使用的是哪个版本的 Oracle? 我认为关键是 XAMPP 在 32 位下工作,因此只能与 Oracle 32 位驱动程序一起工作。 Oracle 客户端 32 位足够智能,可以与 64 位服务器版本通信。但是 XAMPP-32 不够智能,无法与 Oracle 64 位客户端驱动程序一起使用。 你现在是我的英雄,我也下载了64位版本,整晚都在努力解决这个问题!我用的是Windows 10,问题依旧。【参考方案2】:简单步骤
您需要在 php.ini 中启用以下扩展
;extension=php_oci8.dll
;extension=php_oci8_11.g.dll
通过删除“;”以便结果如下:
extension=php_oci8.dll
extension=php_oci8_11.g.dll
下载 Oracle Instant Client:- 最好是 32 位。 32 位也适用于 64 位。你可以谷歌:下载 oracle 即时客户端 windows 32 位。使用版本 11 的客户端,因为 extension=php_oci8_11.g.dll
不适用于 12。将包解压缩到 C:\Oracle\instantclient_11_2
等位置。
最后将系统的PATH
环境变量修改为结束位置,在系统变量下不是用户变量
然后您需要重新启动系统以使PATH
更改完全传播。
如果您只是重新启动 XAMPP/WAMP 而不重新启动机器,则不会加载(也找不到)客户端的 DLL 文件(即 OCL.dll)
通过 PHP 的 php_oci8_11g.dll
扩展。
【讨论】:
您的意思是删除示例中的一个(或两个)分号吗? 我认为您不能为 Instant Client 选择任意架构。我很确定它需要与您的 PHP 架构相匹配。【参考方案3】:需要确认的事项
-
每当你连接Oracle数据库时,尽量使用32位oracle客户端库,因为XAMP PHP是用32位编译的(虽然你有64位windows机器)
从Download From here下载Oracle客户端
粘贴到 C:\instantclient_12_1
然后在系统环境变量中设置上面的路径 然后转到 C:\xampp\php\php.ini 并取消注释 extension=php_oci8_12c.dll 然后重新启动 XAMP,它应该可以正常工作。【讨论】:
【参考方案4】:您需要在 php.ini 文件中启用该扩展。见Oracle Installation:
extension=oci8.so
【讨论】:
你也可以用--with-oci8
构建php
“so”后缀适用于 Solaris。
@sebagiar 是对的。这与 Windows 配置无关。在 Windows 中,正确的扩展名是 DLL。【参考方案5】:
我安装了 WAMPServer 2.5(32 位),也遇到了 oci_connect 错误。我还安装了 Oracle 11g 客户端(32 位)。我在其他帖子中阅读的常见修复方法是更改 C:\wamp\bin\php\php5.5.12 目录中的 php.ini 文件,但这对我没有用。可能是我理解错了,但是我发现如果你改改C:\wamp\bin\apache\apache2.4.9目录下的php.ini文件,就会得到你想要的结果。我在 apache php.ini 文件中唯一更改的是将分号删除到 extension=php_oci8_11g.dll
以启用它。然后我重新启动了所有服务,它现在可以工作了!我希望这对你有用。
【讨论】:
【参考方案6】:-
检查您的 php –version 与 PHP 5.6.32 (cli) 一样(构建时间:2017 年 10 月 25 日 16:02:15)。
使用 OCI8 扩展访问 Oracle 数据库。所以从1https://pecl.php.net/package/oci8/2.0.8/windows下载php_oci8.dll。 (5.6 Thread Safe (TS) x86 ) php_oci8.dll 必须和你的php版本一致。然后解压,你会发现 1.php_oci8.dll 2.php_oci8_11g.dll(根据你的oralce版本)这两个文件粘贴到你的 (xampp\php\ext) 文件夹。
打开您的 php.ini 文件并添加这些 扩展=php_oci8.dll extension=php_oci8_11g.dll
使用这些命令检查您的 oracle 版本和服务名称
-
打开你的 cmd
sqlplus / as sysdba
从 v$version 中选择 *;
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production,我们的 oracle 版本是 11g,所以我们可以使用从 https://www.oracle.com/technetwork/topics/winsoft-085727.html 下载的 instantclient_11_1(Instant Client 32 位)
显示参数服务名称; service_name 是 orcl(你应该记住这个服务名称)
下载 Instantclient_11_1 后解压缩,然后粘贴到本地磁盘中。并复制路径 C:\instantclient_11_1 然后将此路径设置为您的用户变量和系统变量。请注意,我的代码在没有设置路径变量的情况下工作。
打开你的cmd并输入SQL,按照这些命令创建你的架构
-
sqlplus / as sysdba
创建pass123标识的用户dbname;
将连接、资源授予 dbname;
创建表 user_info 并将数据插入到表中并提交。 注意:您必须提交数据,否则数据未插入。
然后此脚本在您的 htdocs 中运行<html>
<head><title>Oracle demo</title></head>
<body>
<?php
// Create connection to Oracle
$conn = oci_connect("dbname", "pass123", "//localhost/orcl"); // orcl is your service_name
$query = 'select * from user_info';
$stid = oci_parse($conn, $query);
$r = oci_execute($stid);
// Fetch each row in an associative array
print '<table border="1">';
while ($row = oci_fetch_array($stid, OCI_RETURN_NULLS+OCI_ASSOC))
print '<tr>';
foreach ($row as $item)
print '<td>'.($item !== null ? htmlentities($item, ENT_QUOTES) : ' ').'</td>';
print '</tr>';
print '</table>';
【讨论】:
非常有帮助。谢谢@Abdul【参考方案7】:好吧,伙计们。
首先,使用
<?php
phpinfo();
?>
并确定您的 PHP 版本(位于最顶部,例如 7.0.xxx) 还有,您的 PHP 版本架构:x64 或 x86 此外,线程安全或非线程安全(位于第一个表中的“线程安全”。)“禁用”显然意味着“非线程安全”。
您需要的以下三个软件是绝对关键的:
-
对于同一主要版本的 PHP(7.0 为 7.0.xxx)
与您正在访问的版本相同的 Oracle 版本(11g、12g 等)
相同的非线程安全/线程安全版本的 PHP
全部用于同一架构。
如果以下任何一项针对不同的架构、非线程安全/线程安全版本、PHP 主要版本号或数据库版本,您将收到错误:
1. PHP for Windows
2. OCI8 PECL Drivers for PHP (https://pecl.php.net/package/oci8)
3. Oracle Instant Client
记住:如果要连接到 11g Oracle 实例,则需要 11g 驱动程序。
第二,安装正确的PHP、OCI8 PECL驱动和即时客户端。
我选择了:
d:\php\ for php
d:\oci\ for instant client
unzip the contents of the OCI8 PECL Driver into d:\php\ext\
第三,根据Oracle给出的指令修改d:\php\php.ini:
1. set the extension directory
2. set only one of the following:
a. for 11g drivers, use extension=php_oci8_11g.dll
b. for 12c drivers, use extension=php_oci8_12c.dll
c. for other oracle DB drivers, use the correct oracle extension.
第四:将 d:\oci\(或任何您的即时客户端安装位置)添加到您的系统 PATH。
第五:重启你的电脑。
第六,在命令提示符下,键入“where oci*”并验证您的 Instant Client 安装路径版本的 oci.dll 是否存在。
Seventh,进入 d:\php\ 并输入“php -m”,您应该会在列表中看到 OCI8。
如果你在输入“php -m”后在模块列表中没有看到OCI8,打开d:\php\errorlog.txt
如果您看到类似的内容:
PHP Warning: PHP Startup: Unable to load dynamic library 'ext\php_oci8_11g.dll' - %1 is not a valid Win32 application.
那么即时客户端或您的 PECL 驱动程序下载与您的 PHP 版本的架构不同。
如果您看到类似的内容:
PHP Warning: PHP Startup: Unable to load dynamic library 'ext\php_oci8_12c.dll' - The specified procedure could not be found.
那么您的即时客户端版本使用了错误的 OCI8 PECL 驱动程序。
希望这会有所帮助。
【讨论】:
【参考方案8】:我安装了 Wamp 并希望一切都能开箱即用。不是这样。 我的 x64 Windows 机器上有 2 个 Oracle 客户端(即时和完整)。如果其他人有类似的设置,诀窍是确保即时客户端 (a) 在您的 Path 环境变量中,并且 (b) 在 Path 变量中的完整客户端之前。关于 Windows here 有一个非常简短的部分,但它给出了答案。
【讨论】:
【参考方案9】:我知道我在这里回复为时已晚,但我尝试了一切,两天都没有为我工作,然后我找到了这个视频。它解决了我的问题。所以我把这个分享给大家。快乐编码:-)
enter link description here
【讨论】:
这是工作视频。感谢分享。我解决了我的问题【参考方案10】:试试这个
在 php.ini 文件中取消注释
extension_dir = "./"
"去掉分号"
【讨论】:
【参考方案11】:我遇到了同样的问题,this page 上的解决方案帮助了我,这是由于使用了不兼容的 oci ddl 文件造成的。
希望对你有帮助。
【讨论】:
【参考方案12】: 下载 xampp 并取消注释 oracle 12c 扩展或 xampp 7.2.9 的 11c 'extension=oci8_11g' 下载即时客户端 32 位并设置其路径 下载即时客户端32位SDK包并设置路径 将即时客户端和 SDK dll 文件复制到 xamp\php\ext、xampp\php\ 和 xampp\appache\bin\ 下载相同php版本的tread safe x86的php-oci,然后将其文件复制到php\ext*.dll, php 版本写在 xampp admin 的 phpinfo 选项卡之上。 OCI8 将出现在 phpadmin 页面或 apache admin 然后 phpadmin 选项卡上。表示已经安装了phpOCI。【讨论】:
XAMPP 现在正在推送 64 位版本,因此您可能需要 64 位 Instant 客户端。如何分辨见blogs.oracle.com/opal/…【参考方案13】:从 Instant Client for Microsoft Windows (x64) 下载并将以下文件解压缩到“c:\oracle”:
instantclient-basic-windows.x64-12.1.0.2.0.zip
instantclient-sqlplus-windows.x64-12.1.0.2.0.zip
instantclient-sdk-windows.x64-12.1.0.2.0.zip 这将创建以下文件夹“C:\Oracle\instantclient_12_1”。
最后,将“C:\Oracle\instantclient_12_1”文件夹添加到PATH环境变量中,放在最左边。
然后重启你的服务器。
【讨论】:
【参考方案14】:1 - 第一步是通过检查 phpinfo 中的 PHP 详细信息,为您的 xampp 或 wampp 或 lampp 安装确定正确的即时客户端。创建一个简单的 php 文件并添加以下代码并在浏览器上预览。
<?php
phpinfo();
?>
phpinfo() details
2 - 转到 https://www.oracle.com/database/technologies/instant-client/downloads.html 并为您的架构(32 位或 64 位)下载正确的即时客户端(基本包和 sdk)
Instant client package - basic
Instant client package - SDK
3 - 将 Instantclient 提取到您的首选目录并将路径添加到您的环境变量。
4 - 转到 php.ini 并通过删除行首的 ;
来启用 oci8
扩展。
寻找这一行
;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client
重构为
extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client
Environment variables
5 - 重启你的电脑
6 - 检查您的 phpinfo(您在步骤 1 中创建的页面)。您应该在下面看到详细信息:
OCI8
【讨论】:
以上是关于调用未定义函数 oci_connect()的主要内容,如果未能解决你的问题,请参考以下文章