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

时间:2018-08-13 10:19:48

标签: php connection-string oci

我在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://...,我将如何转换它?

1 个答案:

答案 0 :(得分:0)

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

$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一起使用。