Mailinglisten-Archive |
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