2012-02-21 10 views
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を他のプロジェクトで使用しましたが、問題はありません。

FYI:私はrootを持っていないので、サーバー上ではあまり魔法を使うことはできません。

あなたの提案は何ですか?

+1

そのSIDのコマンド行でtnspingを試してください – tbone

答えて

1

これは、Oracleの一般的なエラーメッセージであり、zendやPHPとは関係ありません。私は通常、SQLDeveloperまたはToadでこのメッセージを受け取ります。 tnsnames.ora、listener.ora、sqlnet.ora、ログファイルなどを確認し、クライアントアプリケーションとの接続を試みます。

4

$ORACLE_HOME/network/adminフォルダにtnsnames.oraという名前のファイルを作成し、SIDを入れておく必要があります(このファイルは、管理者に報告することができます)。

か、あなたのtnsnames.oraファイルを作成できない場合は、この構文を使用して、あなたのDBの設定を設定してみてください:Althought

$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ファイルを作成します。あなたが接続するためにSIDを使用している場合はZend Frameworkを使用しますが、同様の問題を持っていない方のため

+0

私はexplaが好きですその接続文字列に関係する黒い魔法については国家がそれを解決してくれた。 – TheDude

2

は、この問題を解決するには、変更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()); 
} 

で見つけることができ

(SERVICE_NAME = orcl) 

(SID = yourSid) 
関連する問題