我编写了一个PHP脚本来从Oracle数据库中提取查询并将结果写入csv文件。我使用Zend Framework连接到数据库。我知道凭证是正确的,因为我可以使用SQLPlus通过终端连接。
这是错误:
Zend_Db_Adapter_Exception: SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor (/home/http/php-5.3.3/ext/pdo_oci/oci_driver.c:579) in /opt/http/Zend/ZendFramework-1.10.3/library/Zend/Db/Adapter/Pdo/Abstract.php on line 144
我曾尝试做过研究,但没有可靠的解决方案。我确实读过它可能与tnsnames.ora相关但我在服务器上找不到该文件。我之前在其他项目中使用过Zend而没有任何问题。
仅供参考:我没有root,所以我在服务器上做不了多少魔术。
你有什么建议?
答案 0 :(得分:4)
您需要在$ORACLE_HOME/network/admin
文件夹中创建一个名为tnsnames.ora的文件,并将其添加到您的SID中。
或者如果您无法创建tnsnames.ora,请尝试使用以下语法设置数据库配置:
$config = new Zend_Config(
array(
'database' => array(
'adapter' => 'oracle',
'params' => array(
'dbname'=> '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = hostname.domain.tld)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = service_name)))',
'username' => 'dev',
'password' => 'pwd')
)
)
);
$db = Zend_Db::factory($config->database);
Zend_Db_Table::setDefaultAdapter($db);
尽管使用您的数据库配置创建tnsnames.ora会更好。
答案 1 :(得分:2)
对于那些不使用Zend Framework但有类似问题的人,可以在http://docs.php.net/manual/en/ref.pdo-oci.php#64756上找到解决此问题的方法
$tns = "
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yourip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
";
$db_username = "youname";
$db_password = "yourpassword";
try{
$conn = new PDO("oci:dbname=".$tns,$db_username,$db_password);
}catch(PDOException $e){
echo ($e->getMessage());
}
如果您使用SID进行连接,请更改
(SERVICE_NAME = orcl)
到
(SID = yourSid)
答案 2 :(得分:1)
这是Oracle常见的错误消息,与zend甚至php无关。我通常在SQLDeveloper或Toad中收到此消息。检查tnsnames.ora,listener.ora,sqlnet.ora,日志文件等,并尝试连接客户端应用程序。 (如果它不起作用,您可以向管理员报告)