3

Oracle データベースからクエリを取得し、結果を csv ファイルに書き込む PHP スクリプトを作成しました。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 を作成できない場合は、次の構文を使用して DB 構成を設定してみてください。

$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);

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 に答える