phpbar.de logo

Mailinglisten-Archive

[php] iSeries Zugriff per ODBC, Erfolgsbericht

[php] iSeries Zugriff per ODBC, Erfolgsbericht

Michael Detambel detambel at bfw-oberhausen.de
Mit Sep 24 16:55:55 CEST 2003


Hallo zusammen,

mein letzter Stand bezüglich Zugriff per ODBC auf AS/400 war:

> Warning: SQL error: [unixODBC][Driver Manager]Data source name not 
> found, and no default driver specified, SQL state IM002 in SQLConnect in 
> /srv/www/htdocs/rebus/db2test.php on line 32
> can not connect to DSN: iSeries
 >
> Einziger Unterschied: Die Meldung kommt nicht mehr vom iODBC- sondern 
> vom unixODBC-Driver-Manager :-(.

Nachdem ich die Sache ein paar Wochen in unserem Jahrhundert-Sommer 
schmoren ließ, ging ich gestern wieder ans Werk.

Meine grundlegende Annahme war, dass der Fehler

a) nicht auf der AS/400-Seite liegt, obwohl ich noch V4R4 benutze (im 
IBM Red Book SG24-6551-00 heißt es: "The driver may work to earlier 
releases of OS/400, but is *supportet* accessing only V4R5 and 
later..."), denn ich konnte z. B. über ODBCManager oder KSpread 
problemlos auf die AS/400 zugreifen, nur mit PHP nicht;

b) in der Verarbeitung der INI-Dateien (php.ini, odbc.ini, odbcinst.ini) 
durch PHP liegt (denn PHP 4.3.2 hatte ich neu kompiliert und weder mit 
iODBC noch mit unixODBC klappte es).

Fündig wurde ich schließlich, als ich einen Hinweis aus einem 
Informix-Beispiel (ist ja jetzt auch IBM ;-) folgte: Normalerweise 
erfolgt die Verbindung vom DSN (odbc.ini) zur Treiber-Bibliothek 
(odbcinst.ini) über einen symbolischen Namen. Wie man an untenstehendem 
Beispiel sieht, habe ich den Bibliotheksnamen direkt in die odbc.ini 
eingetragen. Und es funktionierte! Wichtig war außerdem das Setzen der 
Env-Variable ODBCINI im PHP-Skript. Der Systemname der AS/400 kann 
übrigens nur verwendet werden, wenn ein entsprechender DNS-Eintrag 
erfolgt ist, sonst IP-Adresse einsetzen.

Danke an alle für ihre Ratschläge.
Michael Detambel
BFW Oberhausen


Hier meine Test-Dateien:

a) odbc.ini:

[ODBC Data Sources]
iSeries = iSeries Access ODBC Driver

[Default]
Driver		= /opt/ibm/iSeriesODBC/lib/libcwbodbc.so

[iSeries]
Description	= ODBC-Zugriff auf AS/400-Datenbank
Driver		= /opt/ibm/iSeriesODBC/lib/libcwbodbc.so
Driver		= iSeries Access ODBC Driver
System		= S99897DA
UserID		= QUSER
Password	= XYZ
Naming		= 0
DefaultLibraries	= QGPL
ConnectionType		= 2
CommitMode		= 1
ExtendedDynamic		= 0
DefaultPkgLibrary	= QGPL
DefaultPackage		= A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression	= 0
LibraryView		= 1
AllowUnsupportedChar	= 1
ForceTranslation	= 0
Trace		= 0

[ODBC]
DebugFile = /tmp/odbc

b) odbcinst.ini:

[ODBC Drivers]
iSeries Access ODBC Driver = Installed

[iSeries Access ODBC Driver]
Description	= iSeries Access for Linux ODBC Driver
Driver		= /opt/ibm/iSeriesODBC/lib/libcwbodbc.so
Setup		= /opt/ibm/iSeriesODBC/lib/libcwbodbc.so
FileUsage	= 3
CPTimeout	=
CPReuse		=
Threading	= 2

c) PHP-Skript:

<?php
putenv("ODBCINI=/etc/odbc.ini"); // muss sein
require_once 'DB.php';
$user = 'QUSER';
$pass = 'XYZ';
$host = 'iSeries'; // DSN, nicht Hostname (der steht in odbc.ini)!
$db_name = 'AS400.PCINFO';
$dsn = "odbc://$user:$pass@$host/$db_name";
$db = DB::connect($dsn, true);
if (DB::isError($db)) {
         echo $db->getDebugInfo()."<br>";
         die ($db->getMessage());
}
$sql = "SELECT PCBENU FROM AS400.PCINFO.PCKOPF"; // AS400.database.table
$rs = $db->query($sql);
while ($row = $rs->fetchRow())
{
         print $row[0]."<br>";
}
$db->disconnect();
?>



php::bar PHP Wiki   -   Listenarchive