PHP / Linux到AS / 400-db2

我正在尝试在Linux Centos服务器上访问php / 400(iSeries)db2数据库。

我尽可能使用这个IBM指南(尽pipe我们无法获得GUIconfiguration工具的工作)。

http://www-03.ibm.com/systems/i/soft…ide/index.html

我下载并成功安装了iSeriesAccess驱动程序和先决条件。

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

我已经configuration了这些文件来定义驱动程序/ DNS:

/etc/odbc.ini和/etc/odbcinst.ini

 [iSeries Access ODBC驱动程序]
说明= iSeries Access for Linux ODBC驱动程序
 Driver = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
安装程序= /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
 Driver64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
 Setup64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
线程= 2
 DontDLClose = 1
 UsageCount = 1 

文件/etc/odbc.ini是空的,所以我添加了这个configuration:

 [AS400]
说明= iSeries Access ODBC驱动程序
 Driver = iSeries Access ODBC驱动程序
系统= 172.999.999.999(来自netstat选项1)
 UserID = my_user
密码= my_pass
命名= 0
 DefaultLibraries = QGPL
数据库=
 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
跟踪= 1
 DSN = AS400 

我认为这些工作,因为我可以运行

 isql -v AS400

和我连接成功的db2数据库可以从Linux机器执行查询。

但是我一直无法在Linux上使用PHP进行make和ODBC连接。 有没有另一种方法来testing从PHP的DSN? 或获得更详细的错误信息?

 $服务器= “172.999.999.999”;    
     //尝试使用系统名称和“AS400”,dsn名称
 $用户= “my_user”; 
 $传= “MY_PASS”;

 $康恩= odbc_connect($服务器,$用户,$通);
 if($ conn == false){
  回声“不能连接到数据库... 
“; }

结果:

 **无法连接到数据库... ** 

phpinfo()显示php是用unixODBC编译的,而unixODBC是启用的。

任何帮助表示赞赏!

Solutions Collecting From Web of "PHP / Linux到AS / 400-db2"

尝试双重检查您的odbcinst.ini和odbc.ini配置文件。 你有没有在odbc.ini中设置正确的数据库名称/默认库? 我已经成功遵循这些指示:

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

一个区别是,我发现一个包含libXm.so.3的openmotif版本。

http://rpm.pbone.net/index.php3/stat/3/limit/2/srodzaj/1/dl/40/search/libXm.so.3/field%5B%5D/1/field%5B%5D/2

安装php-odbc后重新启动apache。

/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) ?> 

我有一个类似的问题。 我终于找到这个职位: https : //adminramblings.wordpress.com/2015/02/27/odbc-from-linux-to-iseries-as400-for-php/ ,帮助我安装正确的驱动程序,配置它们并连接到数据库。 为了以防万一,我将在这里包含这些信息:


ODBC从Linux到iseries(AS400)的PHP

发布时间:2015年2月27日| 作者:Stephen Dart | 提起下:未分类|发表评论

使用Linux(Ubuntu)盒连接到IBM iSeries(AS400)以使用php查询和报告

IBM ODBC驱动程序(需要登录) http://www-03.ibm.com/systems/power/software/i/access/linux/guide.html

用php和odbc模块安装apache。

 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 Drivers],因此可以添加到最佳。

 /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 Data Sources]和[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中的Driver需要与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 

Oooh错误,多数民众赞成在不好…但我找到了一个修复!

iseries驱动程序和libodbcinst的unixodbc库之间存在差异,在使用驱动程序时会导致上述无意义的错误。

该文件位于该位置内,但实际库存在问题,并且错误消息不是很清楚。

要查看真正的错误,我们需要使用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软件包(当前版本2.2.14p2-5ubuntu5)中有一个修复的unixodbc打包版本之前,我们可以通过符号链接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连接到你的系统,所以你可以通过DSN和你的应用程序来使用它。

下一个阶段是使用PHP来链接到这个odbc。

使用select语句连接到DSN [DEV]的Php页面并将结果放入表中:

 <!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位版本。 希望这可以帮助别人。

实际上工作日志有这个条目:

Mar 9 14:04:52 mtl setroubleshoot:SELinux阻止http守护进程连接到网络端口8471

我关掉了SELinux,问题解决了。

谢谢领先!

您需要在odbc_connect()函数中使用ODBC源名称,而不是服务器IP。 在您的示例中,AS400是odbc.ini文件顶部的括号之间的名称。