PHP 和 OCI8。简单的连接字符串不起作用

问题描述 投票:0回答:1

我有一个同事系统,可以使用 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");
   ?>

我什至不知道还要检查什么。这让我感到困惑。我觉得我要么疯了,要么犯了一些非常愚蠢、明显的错误。有人有什么我应该尝试的吗?

php oracle oci8 tnsnames
1个回答
0
投票

因此文档说您可以互换使用简单连接字符串或 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。

© www.soinside.com 2019 - 2024. All rights reserved.