Domanda

Ho scritto uno script PHP per estrarre una query da un database Oracle e scrivere i risultati in un file CSV. Sto usando Zend Framework per connettersi al database. So che le credenziali sono corrette in quanto sono in grado di connettermi tramite il terminale usando SQLPlus.

Questo è l'errore:

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

Ho cercato di fare ricerche, ma nessuna soluzioni solide. Ho letto che poteva essere associato a tnsnames.ora ma non sono riuscito a trovare quel file sul server. Ho già usato Zend in altri progetti senza problemi.

FYI: Non ho root, quindi non posso fare molta magia sul server.

Quali sono i tuoi suggerimenti?

È stato utile?

Soluzione

Questo è un errormatura comune da Oracle, non c'è nulla a che fare con Zend o persino PHP. Di solito ricevo questo messaggio in Sqldeloper o rospo. Controlla tnsnames.ora, listener.ora, sqlnet.ora, file di registro ecc. E prova a connettersi con un'app client. (Se non funziona, puoi segnalarlo agli amministratori)

Altri suggerimenti

È necessario creare un file chiamato tnsnames.ora nel tuo $ORACLE_HOME/network/admin cartella e mettici dentro il tuo Sid.

Oppure se non puoi creare il tuo tnsnames.ora, prova a impostare la configurazione DB utilizzando questa sintassi:

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

Anche se è meglio creare tnsnames.ora con la tua configurazione DB.

Per coloro che non utilizzano Zend Framework, ma avendo un problema simile, una soluzione a questo problema può essere trovata su 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());
}

Se stai usando SID per connetterti, cambia

(SERVICE_NAME = orcl) 

a

(SID = yourSid) 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top