PHP OCI:连接字符串(从 JDBC 转换)

PHP OCI: Connection string (convert from JDBC)

我在 SQL 开发人员中有以下混淆的连接字符串:

jdbc:oracle:thin:@//xyz-scan.example.com:1521/mydb.example.com

如何在 php oci_connect 中使用它?

$db = 'xyz-scan.example.com:1521/mydb.example.com';

$con = oci_connect('scott', 'tiger', $db, 'AL32UTF8');

导致错误:

ORA-12545: Connect failed because target host or object does not exist

我能ping通服务器。

我也试过了

$db = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)
   (HOST = xyz-scan.example.com)(PORT=1521))
   (CONNECT_DATA=(SERVER=DEDICATED)
   (SID=mydb.example.com)';

并用 service_name 代替 SID。什么都不管用。 上面给出了这个错误:

ORA-12154: TNS:could not resolve the connect identifier specified

如何转换此连接字符串以与 php oci 一起使用? (有没有一种独特的方法?对于不同的数据库,我有一个 @ldap://... 我将如何转换它?

扫描地址第一个问题的解决方法很简单:

$db = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)
(HOST = xyz-scan.example.com)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED)
(SID=<sid>)';

第二个有ldap的就没那么简单了。据我所知,oracle 有它自己的 ldap 东西,你可以在其中存储数据库 TNS 条目。这意味着您可以像查询任何 ldap 系统一样查询它:

<?php
$ds=ldap_connect("oid.mydomain.com", myport); // Connect to oracle ldap
$r=ldap_bind($ds); // Bind to ldap
$sr = ldap_search($ds, "cn=OracleContext,dc=xyz,dc=abc,dc=com", "cn=dbname"); // Run query xyz.abc.com
$info = ldap_get_entries($ds, $sr); // Get entries
ldap_close($ds);
$dbconnectstring = $info[0]["orclnetdescstring"][0]; // Extract db connect string from ldap search result array 
$con = oci_connect('scott', 'tiger', $dbconnectstring);
?>

此脚本将获得完整的 TNS 连接字符串,然后您可以将其用于 oci_connect。