Почему я получаю эту ошибку и как ее исправить? - PullRequest
3 голосов
/ 21 февраля 2012

Я написал 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 раньше в других проектах без каких-либо проблем.

К вашему сведению: у меня нет root, поэтому я не могу много магии на сервере.

Каковы ваши предложения?

Ответы [ 3 ]

4 голосов
/ 22 февраля 2012

Вам необходимо создать файл с именем tnsnames.ora в папке $ORACLE_HOME/network/admin и указать в нем свой 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);

Хотя лучше создать tnsnames.ora с вашей конфигурацией БД.

2 голосов
/ 08 августа 2013

Для тех, кто не использует 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) 
1 голос
/ 21 февраля 2012

Это обычное сообщение об ошибке от Oracle, оно не имеет ничего общего с zend или даже php.Я обычно получаю это сообщение в SQLDeveloper или Toad.Проверьте tnsnames.ora, listener.ora, sqlnet.ora, файлы журналов и т. Д. И попробуйте подключиться к клиентскому приложению.(если он не работает, вы можете сообщить об этом администраторам)

...