为什么会出现这个错误,我该如何解决?

问题描述:

我已经写了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,没有任何问题。

FYI:我没有根,所以我不能做服务器上大的魔力。

你有什么建议?

+1

尝试在该SID的cmd行上输入tnsping – tbone 2012-02-21 14:26:33

这是从Oracle共同errormessage的,没有什么做与Zend甚至PHP。我通常在SQLDeveloper或Toad中获取此消息。检查的tnsnames.ora,listener.ora中,SQLNET.ORA,日志文件等,并尝试与客户端应用程序连接。 (如果它不工作,可以向管理员报告)

您需要在$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); 

Althought其更好地与您的数据库配置创建的tnsnames.ora。

+0

我想说明一下国家对与该连接字符串有关的黑魔法,但它为我固定的东西。 – TheDude 2017-07-24 17:18:48

对于那些不使用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)