PHP / Linux в AS / 400-db2 - PullRequest
       45

PHP / Linux в AS / 400-db2

6 голосов
/ 09 марта 2011

Я пытаюсь получить php для доступа к серверу Linux Centos как база данных / 400 (iSeries) db2.

Я использую это руководство IBM в максимально возможной степени (хотя мы не смогли заставить работать утилиту конфигурирования графического интерфейса).

http://www -03.ibm.com / системы / я / мягкий ... язь / index.html

Я загрузил и успешно установил драйверы iSeriesAccess и предварительные требования.

rpm -i iSeriesAccess-5.4.0-1.6.i386.rpm

Я настроил эти файлы для определения драйверов / DNS:

/ etc / odbc.ini и /etc/odbcinst.ini

[iSeries Access ODBC Driver]
Description          = iSeries Access for Linux ODBC Driver
Driver               = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Setup                = /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
Driver64             = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup64              = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading            = 2
DontDLClose          = 1
UsageCount           = 1 

файл /etc/odbc.ini был пуст, поэтому я добавил эту конфигурацию:

[AS400]
Description     = iSeries Access ODBC Driver
Driver          = iSeries Access ODBC Driver
System          = 172.999.999.999             (from netstat option 1)
UserID          = my_user
Password        = my_pass
Naming          = 0
DefaultLibraries  = QGPL
Database          =
ConnectionType    = 0
CommitMode        = 2
ExtendedDynamic   = 1
DefaultPkgLibrary = QGPL
DefaultPackage    = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression  = 1
LibraryView           = 0
AllowUnsupportedChar  = 0
ForceTranslation      = 0
Trace           = 1
DSN             = AS400 

Я предполагаю, что они работают, потому что я могу запустить

isql -v AS400

и я успешно подключаюсь к базе данных db2, могу выполнять запросы из окна Linux.

Однако мне не удалось получить make и ODBC-соединение в PHP на Linux-боксе. Есть ли другой способ проверить DSN от php? или получить более подробную информацию об ошибке?

$server="172.999.999.999";    
    // tried with both system name and "AS400", the dsn name
$user="my_user"; 
$pass="my_pass";

$conn=odbc_connect($server,$user,$pass);
if ($conn == false) {
  echo "Not able to connect to database...<br>";
}

результат:

**Not able to connect to database...** 

phpinfo () показывает, что php был скомпилирован с unixODBC и unixODBC включен.

любая помощь приветствуется!

Ответы [ 4 ]

6 голосов
/ 09 марта 2011

Попробуйте дважды проверить ваши конфигурационные файлы odbcinst.ini и odbc.ini.У вас есть правильное имя базы данных / библиотека по умолчанию, установленная в odbc.ini?Я успешно выполнил следующие инструкции:

http://werk.feub.net/2010/11/ingredients-php-db2-and-unixodbc/

Разница в том, что я нашел версию openmotif, которая включала libXm.so.3.

http://rpm.pbone.net/index.php3/stat/3/limit/2/srodzaj/1/dl/40/search/libXm.so.3/field[]/1/field[]/2

Перезапустите apache после установки php-odbc.

/ etc / odbc.ini

[ISERIES]
Description = iSeries Access ODBC Driver DSN for iSeries
Driver = iSeries Access ODBC Driver
System = 192.168.1.1
UserID = MYUSER
Password = MYPASSWORD
Naming = 0
DefaultLibraries = QGPL
Database =
ConnectionType = 0
CommitMode = 2
ExtendedDynamic = 0
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0

Пример PHP:

<?php
if (!$db = odbc_connect ( "ISERIES", "MYUSER", "MYPASSWORD") )
    echo 'error!';

$result = odbc_exec($db, "SELECT * FROM MYUSER.TABLENAME");
while (odbc_fetch_row($result)) {
    echo odbc_result($result, "ID")."\n";
}

odbc_close($db)
?>
5 голосов
/ 27 июня 2015

У меня была похожая проблема. Я наконец нашел этот пост: https://adminramblings.wordpress.com/2015/02/27/odbc-from-linux-to-iseries-as400-for-php/, который помог мне установить правильные драйверы, настроить их и подключиться к базе данных. Я включу информацию здесь на всякий случай:


ODBC от Linux до iseries (AS400) для php

Опубликовано: 27 февраля 2015 г. | Автор: Стивен Дарт | Подано в: Без рубрики | Оставить комментарий

Использование коробки linux (Ubuntu) для подключения к IBM iSeries (AS400) для использования php-запросов и создания отчетов

Драйвер IBM ODBC (требуется регистрация) http://www -03.ibm.com / systems / power / software / i / access / linux / guide.html

Установить apache с модулями php и odbc.

sudo apt-get install libapache2-mod-php5 apache2 php5-odbc

Установить unixodbc

sudo apt-get install unixodbc

Скопируйте загруженный драйвер iseries odbc на сервер и установите

sudo dpkg -i ibm-iaccess-1.1.0.2-1.0.amd64.deb

символическая ссылка на библиотеки в папку / usr / lib для использования в системе

sudo ln -s /opt/ibm/iSeriesAccess/lib64/libcwb* /usr/lib

Теперь мы можем создать настройку odbc с помощью драйвера. Найдите, где находятся файлы SYSTEM odbcinst.ini и odbc.ini:

odbcinst -j

unixODBC 2.2.14
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources

Отредактируйте файлы, в файле odbcinst.ini должна быть уже установлена ​​установка драйвера IBM iseries в процессе установки драйвера, но в файле по умолчанию отсутствует заголовок [Драйверы ODBC], который, как я обнаружил, вызвал проблемы, поэтому может быть добавлено в топ.

/etc/odbcinst.ini

[ODBC Drivers]
IBM i Access ODBC Driver
Description = IBM i Access for Linux ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
Driver64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

[IBM i Access ODBC Driver 64-bit]
Description = IBM i Access for Linux 64-bit ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

Теперь создайте odbc.ini для вашей конкретной системы, важно создать [Источники данных ODBC] и [DSN]

Пример odbc.ini

[ODBC Data Sources]
DEV = DEV

[DEV]
Description = iSeries Access ODBC Driver
Driver = IBM i Access ODBC Driver
System = FQDN or IP
UserID = USER
Password = PASSWORD
Naming = 1
DefaultLibraries = QGPL
Database =
ConnectionType = 2
CommitMode = 2
ExtendedDynamic = 1
DefaultPkgLibrary =
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 1
ForceTranslation = 1
Trace = 0

Имя в скобках в odbc - это DSN, в этом случае [DEV] Драйвер в odbc.in должен соответствовать имени, указанному в odbcinst.ini

Система - это имя сети в формате fqdn или IP.

Идентификатор пользователя и пароль необходимы для входа в систему iseries.

DefaultLibraries, Database и DefaultPkgLibrary могут быть указаны как обязательные или оставлены пустыми и указаны выше в php, я использую только DefaultLibraries.

Проверьте соединение с помощью командной строки isql и DSN.

isql -v DEV
[unixODBC][Driver Manager]Can't open lib '/opt/ibm/iSeriesAccess/lib64/libcwbodbc.so': file not found

О-О-О-О-О-О, это нехорошо ... но я нашел исправление!

Существует несоответствие между драйвером iseries и библиотеками unixodbc для libodbcinst, что может привести к указанной выше бессмысленной ошибке при использовании драйвера.

Файл находится в папке, но существует проблема с реальной библиотекой, и сообщение об ошибке не очень ясно.

Чтобы увидеть истинную ошибку, нам нужно использовать ldd, чтобы увидеть связанные зависимости libcwdodbc.so

ldd /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
linux-vdso.so.1 => (0x00007fff86dfe000)
libodbcinst.so.2 => not found
libcwbcore.so => /usr/lib/x86_64-linux-gnu/libcwbcore.so (0x00007f7f68545000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7f68240000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7f67f3a000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7f67d24000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7f6795d000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7f6773f000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7f6753b000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7f67332000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7f68b98000)

Пока в пакетах ubuntu не будет пакетной версии unixodbc с исправлением (текущая версия 2.2.14p2-5ubuntu5), мы можем символически связать so.1 с so.2

sudo ln -s /usr/lib/x86_64-linux-gnu/libodbcinst.so.1 /usr/lib/x86_64-linux-gnu/libodbcinst.so.2

Статья IBM об этом: http://www.ibm.com/developerworks/ibmi/library/i-ibmi-access-client-solutions-linux/

При запуске ldd теперь отображаются необходимые библиотеки.

ldd /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
linux-vdso.so.1 => (0x00007fff315fe000)
libodbcinst.so.2 => /usr/lib/x86_64-linux-gnu/libodbcinst.so.2 (0x00007fcef32ed000)
libcwbcore.so => /usr/lib/x86_64-linux-gnu/libcwbcore.so (0x00007fcef2f7a000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcef2c75000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcef296f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcef2759000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcef2392000)
libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007fcef2188000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcef1f6a000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fcef1d65000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fcef1b5d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcef37df000)

Теперь мы можем перезапустить isql и протестировать.

isql -v DEV
+---------------------------------------+
| Connected!                           |
|                                      |
| sql-statement                        |
| help [tablename]                     |
| quit                                 |
|                                      |
+---------------------------------------+

SQL

Woot, подключен!

Хорошо, теперь у вас есть работающее соединение ODBC с вашим iseries, так что вы можете использовать его через DSN и ваши приложения.

Следующим этапом было использование php для ссылки на этот odbc.

Страница php, подключающаяся к DSN [DEV] с помощью оператора select и помещающая результаты в таблицу:

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
</style>
</head>
<body>

<?php
try{
$as400conn = new PDO(‘odbc:DEV’); 
// Note: The name is the same as what’s in our square brackets in ODBC.ini
$as400conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$library = “as400 library”;
$file = “as400 file”;
$i = 0;
$fields[$i++] = “file field 1″;
$fields[$i++] = “file field 2″;
$fields[$i++] = “file field 3″;
$AryLength = count($fields);
// Create SQL Have to include first field for comma separate outside of the while loop. field,field
$sql = “SELECT ” . $fields[0] ;
for($x = 1; $x < $AryLength; $x++) {
$sql = $sql . “,” . $fields[$x] ;
}
$sql = $sql.” FROM ” . $library . “/” . $file ;
echo $sql;
echo “<br>”;
$result = $as400conn->query($sql);

// Print Table Header //
echo “<table><tr>”;
for($x = 0; $x < $AryLength; $x++) {
echo “<th> $fields[$x] </th>”;
}
echo “</tr>”;

// Output Data of each row
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
echo “<tr> “;
for($x = 0; $x < $AryLength; $x++) {
echo “<td>” . $row[$fields[$x]] . “</td>”;
}
echo “</tr>”;
}
echo “</table>”;
$as400conn = null;

//end of try
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
</body>
</html>

Я установил как на 32-битную, так и на 64-битную версию Ubuntu, используя это руководство. Вам просто нужно настроить несколько имен папок, если вы хотите установить 32-битную версию. Надеюсь, это поможет кому-то еще.

2 голосов
/ 09 марта 2011

действительно в журнале заданий была такая запись:

9 марта, 14:04:52. SELinux препятствует подключению демона http к сетевому порту 8471

Я выключил SELinux, и проблема решена.

Спасибо за лидерство!

0 голосов
/ 13 октября 2011

В функции odbc_connect() необходимо использовать имя источника ODBC, а не IP-адрес сервера. В вашем примере AS400 - это имя в скобках вверху файла odbc.ini.

...