#php #database #oracle #codeigniter
#php #База данных #Oracle #codeigniter
Вопрос:
Я использую PHP 5.3.3, потому что я не контролирую сервер. Я также использую CodeIgniter 3.1.0. Я пытаюсь использовать CI для подключения к серверу Oracle, Oracle 11g выпуска 11.2.0.4.0.
Я могу подключиться просто отлично, используя php oracle_connect:
$connect_string = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAME)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SID = MYSID)))";
$oconnect = oci_connect(USERNAME, PASSWORD, $connect_string );
$query = "select * from DB.TABLE";
$stid=oci_parse($oconnect, $query);
$r = oci_execute($stid);
while ($row = oci_fetch_array($stid, OCI_RETURN_NULLS OCI_ASSOC)) {
print_r($row);
}
Но когда я пытаюсь настроить подключение к БД из CodeIgniter, я получаю сообщение об ошибке, что имя TNS неизвестно, или что он не может подключиться, или что служба неизвестна. Зависит от того, как я это настрою.
Обратите внимание, что примеры на CodeIgniter могут быть неправильными. DSN использует SID= там, где в примерах есть SERVICE = ; только когда я прочитал комментарии пользователей в руководстве по php, они предложили SID= для php oci_connect.
Вот что у меня есть для CodeIgniter:
$dsn_string = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAME)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SID = MYSID)))";
$db['default'] = array(
'dsn' => $dsn_string,
'hostname' => 'HOSTNAME',
'username' => 'USERNAME',
'password' => 'PASSWORD',
'database' => 'DB',
'dbdriver' => 'oci8',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
Есть идеи о том, что может происходить? Я также собираюсь попробовать несколько других вещей. Я мог бы просто проигнорировать подключение CI к БД, но поскольку я использую его в основном как поставщик API для интерфейса angular, db является основной причиной, по которой я вообще использую CI.
Спасибо!
Комментарии:
1. Может быть, отсутствие требований ?
2. Возможно, попробуйте использовать синтаксис EZCONNECT :
$dsn = 'hostname/mysid';
Ответ №1:
@Tpojka — Я должен использовать предоставленный мне сервер, но, оказывается, проблема была не в этом.
Проблема заключалась в файле .htaccess. Я использовал существующий .htaccess, и в нем была следующая строка:
DirectoryIndex index.php
Сначала я ничего об этом не подумал, так как это довольно обычная строка, но потом я понял, что изменил свой config.php чтобы удалить index.php из URL. Как только я удалил эту строку из .htaccess, все снова заработало.
Блин. Я не думал, что это может привести к ошибкам базы данных, но это было окончательное решение, позволяющее избавиться от последней ошибки.