3

我编写了一个 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,所以我不能在服务器上做很多魔法。

你有什么建议?

4

3 回答 3

4

您需要在您的文件夹中创建一个名为 tnsnames.ora 的$ORACLE_HOME/network/admin文件并将您的 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 会更好。

于 2012-02-21T22:26:03.430 回答
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) 
于 2013-08-07T20:23:36.283 回答
1

这是来自 Oracle 的常见错误消息,与 zend 甚至 php 无关。我通常在 SQLDeveloper 或 Toad 中收到此消息。检查 tnsnames.ora、listener.ora、sqlnet.ora、日志文件等,并尝试与客户端应用程序连接。(如果它不起作用,您可以向管理员报告)

于 2012-02-21T14:26:37.437 回答