なぜこのエラーが発生し、どのように修正するのですか?
-
28-10-2019 - |
質問
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を持っていないので、サーバーであまり魔法をかけることはできません。
あなたの提案は何ですか?
解決
それはOracleからの一般的なエラーです。ZendやPHPとは何の関係もありません。私は通常、このメッセージをsqldeveloperまたはヒキガエルで受け取ります。 tnsnames.ora、listener.ora、sqlnet.ora、logファイルなどを確認し、クライアントアプリに接続してみてください。 (機能していない場合は、管理者に報告できます)
他のヒント
あなたはあなたの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 configを使用してtnsnames.oraを作成する方が良いです。
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)