Проверка соединения ODBC с Informix в PHP PDO

У нас немного странная ситуация. Были огромные проблемы с подключением к Informix через ODBC источник данных с использованием PDO а также PHP, В конце концов разработал строку подключения, и он, казалось, для подключения. Тем не менее, когда я пытаюсь запустить любой SQL с базой данных (используя prepare() а также execute() и даже PDO->query() все, что я возвращаю, является значением false. Нет записей, нет ошибок, нет ничего.

Если я изменяю имя источника данных на что-то, что не существует, я немедленно получаю сообщение об ошибке (что источник данных не существует), но как только источник данных корректен, вызов для создания нового PDO объект работает.

Я обернул мои операторы prepare и query в блок try / catch, но все еще ничего.

Может ли кто-нибудь дать мне какие-либо идеи о том, где мы можем пойти не так или, точнее, как я могу проверить подключение к базе данных? Хотя ошибки нет, я не уверен, что она успешно подключена.

Строка подключения:

DSN=$database;UID=$username;PWD=$password;

Любая помощь будет оценена.

0

Решение

«Имя источника данных не найдено, и драйвер по умолчанию не указан» будет исходить из диспетчера драйверов, поэтому, возможно, даже если вы укажете действительный DSN, драйвер может не загружаться (или отсутствовал вообще)

Я предлагаю убедиться, что драйвер ODBC работает с использованием чего-то вроде ‘isql’ (не уверен, какую диспетчер платформ / драйверов вы используете, но если это Linux, то это должен быть UnixODBC, который поставляется с ‘isql’ по умолчанию).
Вы можете получить более значимое сообщение об ошибке из isql, чем php.

Это быстрое соединение с использованием php и isql, проверьте переменные env:

informix@irk:/usr3/products/php5$ echo $ODBCINI
/usr3/products/php5/odbc.ini

informix@irk:/usr3/products/php5$ echo $INFORMIXDIR
/usr3/products/4.10.UC7D

informix@irk:/usr3/products/php5$ echo $LD_LIBRARY_PATH
/usr3/products/4.10.UC7D/lib:/usr3/products/4.10.UC7D/lib/cli:/usr3/products/4.10.UC7D/lib/esql

informix@irk:/usr3/products/php5$ cat $ODBCINI
[stores7]
Driver=/usr3/products/4.10.UC7D/lib/cli/iclit09b.so
Description=IBM INFORMIX ODBC DRIVER
Database=stores7
LogonID=informix
pwd=dummy
Servername=irk1210
;
; UNICODE connection Section
;
[ODBC]
;uncomment the below line for UNICODE connection
;UNICODE=UCS-2
;UNICODE=UTF-8
;
; Trace file Section
;
Trace=0
TraceFile=/tmp/odbctrace2.out
InstallDir=/usr3/products/4.10.UC7D
TRACEDLL=idmrs09a.so

informix@irk:/usr3/products/php5$ grep irk1210 $INFORMIXSQLHOSTS
irk1210shm onipcshm irk irk1210shm
irk1210 onsoctcp irk  3046

informix@irk:/usr3/products/php5$ cat t.php
<?php
try {
$db = new PDO("odbc:stores7", "informix", "dummy");
print "Connection Established!\n";
$result=$db->query("select tabname from systables;");
$row=$result->fetch(PDO::FETCH_NUM);
print_r($row);

} catch (PDOException $e) {
print $e->getMessage();
}
?>

informix@irk:/usr3/products/php5$ isql -v stores7
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select first 1 tabname from systables
+---------------------------------------+
| tabname                                                                                                                         |
+---------------------------------------+
| systables                                                                                                                       |
+---------------------------------------+
SQLRowCount returns -1
1 rows fetched
SQL> ^Cinformix@irk:/usr3/products/php5$ cat t.php
<?php
try {
$db = new PDO("odbc:stores7", "informix", "dummy");
print "Connection Established!\n";
$result=$db->query("select tabname from systables;");
$row=$result->fetch(PDO::FETCH_NUM);
print_r($row);

} catch (PDOException $e) {
print $e->getMessage();
}
?>

informix@irk:/usr3/products/php5$ php t.php
Connection Established!
Array
(
[0] => systables
)
informix@irk:/usr3/products/php5$

Убедитесь, что у вас есть переменная окружения INFORMIXDIR, указывающая на CSDK, и LD_LIBRARY_PATH (снова предполагая, что это Linux) установлен по крайней мере на:

$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$INFORMIXDIR/cli

поэтому библиотека ODBC может загрузить все, что ей нужно.

0

Другие решения

Попробуйте мою вторую презентацию с конференции IIUG 2017:

http://smooth1.co.uk/ -> «Сессия конференции IIUG 2017 A13 / A14 Новые возможности разработки приложений Informix — zip-файл 2»

Среди языков я рассматриваю настройку и использование Informix / PHP.

Из почтового файла

  • php_htdocs.tar.gz Примеры PHP-файлов, которые можно поместить в папку apache htdocs для тестирования Informix / PHP.

  • 201704_InfAppDev2.txt Как настроить PHP / PDO / Informix и использовать предыдущий файл.

Как показано ниже, режимом ошибок по умолчанию для PHP / PDO является PDO :: ERRMODE_SILENT, вам может потребоваться PDO :: ERRMODE_WARNING или, возможно, PDO :: ERRMODE_EXCEPTION обработка ошибок на основе исключений.

Мой пример htdocs включает запросы различных способов, вставку / обновление / удаление, обработку ошибок и обработку транзакций.

<?php

$db = new PDO("informix:host=localhost.localdomain; service=23176;database=justdave; server=ol_informix1210; protocol=onsoctcp;EnableScrollableCursors=1;", "testuser", "testpass");
print "Connection Established!<br>";

# Default is PDO::ERRMODE_SILENT
print "<br><h2>PDO::ERRMODE_SILENT</h2><br>";
$db->query('SLECT name FROM test_table2');
print "PDO::errorCode ".$db->errorCode()."<br>";
print "PDO::errorInfo <br>";
$err=$db->errorInfo();
print_r($err);
print "<br><br>".$err[2]."<br>";

# Also PDO::ERRMODE_WARNING
print "<br><h2>PDO::ERRMODE_WARNING</h2><br>";
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$db->query('SLECT name FROM test_table2');

# Also PDO::ERRMODE_EXCEPTION
print "<br><h3>PDO::ERRMODE_EXCEPTION</h3><br>";
try {
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$db->query('SLECT name FROM test_table2');
} catch (PDOException $e) {
print "Error: ".$e->getMessage()."<br>";
print "File: ".$e->getFile()."<br>";
print "Line: ".$e->getLine()."<br>";
print "Code: ".$e->getCode()."<br>";
print "Trace: ";
print_r($e->getTrace());
print "<br><h2>Exception object</h2>";
print_r($e);
die();
}

?>
0

По вопросам рекламы [email protected]