PHP/Linux到AS/400-db2

PHP/Linux到AS/400-db2,linux,odbc,db2,ibm-midrange,Linux,Odbc,Db2,Ibm Midrange,我正在尝试在Linux Centos服务器上访问php as/400(iSeries)db2数据库 我尽可能多地使用本IBM指南(尽管我们无法让GUI配置实用程序正常工作) http://www-03.ibm.com/systems/i/soft...ide/index.html 我下载并成功安装了iSeries Access驱动程序和必备组件 rpm -i iSeriesAccess-5.4.0-1.6.i386.rpm rpm-i iSeries Access-5.4.0-1.6.i386.

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

我尽可能多地使用本IBM指南(尽管我们无法让GUI配置实用程序正常工作)

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

我下载并成功安装了iSeries Access驱动程序和必备组件

rpm -i iSeriesAccess-5.4.0-1.6.i386.rpm rpm-i iSeries Access-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 [iSeries访问ODBC驱动程序] Description=iSeries访问Linux ODBC驱动程序 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 线程=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 [AS400] Description=iSeries访问ODBC驱动程序 Driver=iSeries访问ODBC驱动程序 系统=172.999.999.999(来自netstat选项1) UserID=我的用户 密码=我的通行证 命名=0 DefaultLibraries=QGPL 数据库= ConnectionType=0 CommitMode=2 ExtendedDynamic=1 DefaultPkgLibrary=QGPL DefaultPackage=A/DEFAULT(IBM),2,0,1,0512 AllowDataCompression=1 LibraryView=0 AllowUnsupportedChar=0 ForceTranslation=0 跟踪=1 DSN=AS400 我想这些都能用,因为我能跑

isql -v AS400 isql-vs400 并且我成功地连接到db2数据库,可以从LinuxBox执行查询

但是,我无法在Linux机器上获得PHP中的make和ODBC连接。 有没有其他方法可以从php测试DSN?或者获取更详细的错误信息

$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...
"; } $server=“172.999.999.999”; //尝试使用系统名称和dsn名称“AS400” $user=“我的用户”; $pass=“我的通行证”; $conn=odbc\u connect($server、$user、$pass); 如果($conn==false){ echo“无法连接到数据库…
”; } 结果:

**Not able to connect to database...** **无法连接到数据库…** phpinfo()显示php是使用unixODBC编译的,并且启用了unixODBC


感谢您的帮助

请再次检查odbcinst.ini和odbc.ini配置文件。odbc.ini中是否设置了正确的数据库名称/默认库?我成功地遵循了这些指示:

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

安装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
[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
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)
?>

实际上,作业日志中有以下条目:

3月9日14:04:52 mtl setroubleshoot: SELinux正在阻止http守护进程连接到网络端口8471

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


谢谢你的领导

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

我也有类似的问题。我终于找到了这篇文章:它帮助我安装了正确的驱动程序,配置了它们并连接到数据库。我将在此处包含这些信息,以防:


用于php的从Linux到iseries(AS400)的ODBC

发布日期:2015年2月27日|作者:斯蒂芬·达特|存档于:未分类|发表评论

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

IBM ODBC驱动程序(需要登录)

使用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设置。查找系统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数据源]和[DSN]

示例/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
[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,在这种情况下,odbc.in中的[DEV]驱动程序需要与odbcinst.ini中指定的名称匹配

System是fqdn或IP中的网络名称

用户ID和密码是登录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驱动程序和libodbcinst的unixodbc库之间存在差异,这可能导致在使用驱动程序时出现上述无意义的错误

该文件位于该位置内,但实际库存在问题,错误消息不太清楚

要查看真正的错误,我们需要使用ldd查看libcwdobc.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关于这方面的文章:

运行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

呜,接通了

好的,现在您有了一个到iseries的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>

表,th,td{