【问题标题】:PHP/Linux to AS/400-db2PHP/Linux 到 AS/400-db2
【发布时间】:2011-07-11 14:34:30
【问题描述】:

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

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

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

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

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

我已配置这些文件来定义驱动程序/DNS:

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

[iSeries Access ODBC 驱动程序] 说明 = iSeries Access for Linux ODBC 驱动程序 驱动程序 = /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 不要DLC关闭 = 1 使用次数 = 1

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

[AS400] 说明 = iSeries Access ODBC 驱动程序 驱动程序 = iSeries Access ODBC 驱动程序 系统 = 172.999.999.999(来自 netstat 选项 1) 用户 ID = my_user 密码 = my_pass 命名 = 0 DefaultLibraries = QGPL 数据库 = 连接类型 = 0 提交模式 = 2 扩展动态 = 1 DefaultPkgLibrary = QGPL DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512 允许数据压缩 = 1 图书馆视图 = 0 AllowUnsupportedChar = 0 强制翻译 = 0 迹线 = 1 DSN = AS400

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

isql -v AS400

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

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

$server="172.999.999.999"; // 尝试使用系统名称和“AS400”,dsn 名称 $user="my_user"; $pass="my_pass"; $conn=odbc_connect($server,$user,$pass); if ($conn == false) { echo "无法连接数据库...
"; }

结果:

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

phpinfo() 显示 php 是用 unixODBC 编译的,并且 unixODBC 已启用。

感谢任何帮助!

【问题讨论】:

  • 如果您清除了浏览器cookie,无法自动登录,请使用您订阅的相同方法手动登录。

标签: linux odbc db2 ibm-midrange


【解决方案1】:

尝试仔细检查您的 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[]/1/field[]/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)
?>

【讨论】:

【解决方案2】:

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


ODBC 从 Linux 到 iseries (AS400) for php

发布时间:2015 年 2 月 27 日 |作者:斯蒂芬·达特 | Filed under: Uncategorized |发表评论

使用 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 驱动程序],因此可以添加到顶部。

/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

[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] Driver 需要与 odbcinst.ini 中指定的名称匹配

System 是 fqdn 或 IP 中的网络名称。

用户名和密码是登录系列所必需的。

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 查看 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

哇,已连接!

好的,现在您已经与您的系列建立了有效的 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 位版本,您只需调整一些文件夹名称。希望这对其他人有帮助。

【讨论】:

    【解决方案3】:

    确实工作日志有这个条目:

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

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

    感谢您的指导!

    【讨论】:

    • 很高兴听到您发现了问题。如果您需要重新启用 SELinux,我认为以下命令应该可以解决该问题: setsebool -P httpd_can_network_connect=1
    • 由于 Jordan 的回答对您有帮助,请考虑投票并接受它。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多