2012-02-21 208 views
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,沒有任何問題。

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

你有什麼建議?

+1

嘗試在該SID的cmd行上輸入tnsping – tbone 2012-02-21 14:26:33

回答

1

這是從Oracle共同errormessage的,沒有什麼做與Zend甚至PHP。我通常在SQLDeveloper或Toad中獲取此消息。檢查的tnsnames.ora,listener.ora中,SQLNET.ORA,日誌文件等,並嘗試與客戶端應用程序連接。 (如果它不工作,可以向管理員報告)

4

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

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) 
相關問題