我有一个同事系统,可以使用 TNSNAME 从 php 连接到 oracle,但不能使用简单的连接字符串。同样的简单连接字符串在我的系统中工作,设置相同(看起来)
我们都有 wamp 3.3.0,php 8.0.26。它开箱即用,零配置更改。我们都有 oracle 客户端 19c。我的是64位,他的是32位。我们的 TNSNAMES 和 sqlnet 文件是相同的。我们在 C:/Path 中有 TNSNAMES 和 sqlnet,并且有 TNS_ADMIN = C:/Path 的用户和系统级环境变量
我们的 TNS 条目是
ORCL.WORLD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCLSERV)
)
)
这段代码对我来说适用,但他得到: ORA-12154: TNS:无法解析第 2 行 C:\wamp64\www oo.php 中指定的连接标识符
这似乎意味着它正在尝试解析简单连接字符串,就好像它是 tnsname 一样?
<?php
print oci_connect("username", "password", "//192.168.56.1:1521/ORCLSERV");
?>
我已经为简单连接字符串尝试了不同的语法,有不带//、带端口和不带端口。
但是,这段代码对他(和我)有用:
<?php
print oci_connect("username", "password", "ORCL.WORLD");
?>
我什至不知道还要检查什么。这让我感到困惑。我觉得我要么疯了,要么犯了一些非常愚蠢、明显的错误。有人有什么我应该尝试的吗?
因此文档说您可以互换使用简单连接字符串或 TNSNAMES。它没有提到在两种方法之间交换的任何类型的设置,但实际上存在is一个设置。
正确设置的 TNSNAMES 文件的存在有效地充当强制 oci_connect() 只接受 TNSNAMES 条目作为第三个参数的设置。这意味着,如果您有 TNSNAMES 设置,并且有第三个参数“//192.168.56.1:1521/ORCLSERV”,它将在您的 TNSNAMES.ora 文件中搜索名为“//192.168.56.1:1521/ORCLSERV”的服务器。当然它不会找到它并会发出“ORA-12154:TNS:无法解析指定的连接标识符”
我们的系统工作方式不同的原因是因为我不明白 WAMP/PHP 使用系统级别的 TNS_ADMIN 设置。
我的 TNSNAMES 适用于 sql Developer、toad、sqlplus 等。所以我认为它也适用于 PHP。我误解了。我只设置了适用于所有其他应用程序的用户 TNS_ADMIN,但 PHP 需要设置系统 TNS_ADMIN。所以我的 oci_connect 处于简单连接模式。
我的同事系统已设置系统和用户 TNS_ADMIN。所以他的 PHP 的 TNSNAMES 是正确的,所以他的 oci_connect 使用了 TNSNAMES。