首页 > 解决方案 > 无法在 linux 机器上通过 ODBC 连接到 informix

问题描述

我正在运行 CentOS 7 的虚拟机上工作,我正在尝试通过一些 php.ini 使用 ODBC (unixODBC) 连接到 Informix 数据库。

我正在使用 php7.0,我已经安装了 unixODBC-2.3.7 以及 informix sdk 包(iif.12.10.FC12DE.linux-x86_64)。

我已将 odbc.ini 和 odbcinst.ini 配置为:

odbcinst.ini:

[ODBC Drivers]
IBM INFORMIX ODBC DRIVER=Installed
[IBM INFORMIX ODBC DRIVER]
Driver=/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so
Setup=/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so
APILevel=1
ConnectFunctions=YYY
DriverODBCVer=03.80
FileUsage=0
SQLLevel=1
smProcessPerConnect=Y

odbc.ini:

[ODBC Data Sources]
informix_db=IBM INFORMIXODBC DRIVER

[informix_db]
Driver=/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so
Description=IBM INFORMIX ODBC DRIVER
HostName=xxx.xxx.xxx.xxx
Service=xxxx
Database=xxx
LogonID=xxx
pwd=xxx
ServerName=xxx
Client_Locale=xxx
DB_Locale=xxx

然后我使用以下命令设置环境变量:

export INFORMIXDIR=/opt/IBM/Informix_Software_Bundle
export INFORMIXSERVER=xxx
export LD_LIBRARY_PATH=${INFORMIXDIR}/lib/cli

我的php代码如下:

<?php 
$dbUserName=xxx;
$dbPassword=xxx;
$conn=odbc_connect("Driver={IBM INFORMIX ODBC DRIVER};HOSTNAME=xxx;Database=xxx;PORT=xxx;PROTOCOL=onsoctcp;", $dbUserName, $dbPassword);
 if (!$conn)
 {
    echo odbc_errormsg();
 }
 else {
    $sql="{CALL somequery}";
    $res=odbc_exec($conn,$sql);
    odbc_result_all($res);
 }
?>

不幸的是,当我运行 php 时,出现以下错误:

[unixODBC][Driver Manager]Can't open lib '/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so' : file not found

我读过一个类似的问题,这可能是由 DriverVersion 错误引起的,所以我在 odbcinst.ini 中尝试了 03.80 和 02.70(使用 php 和 unixODBC 安装的 odbc)。

我对 linux 还很陌生,不知道还有什么其他问题可能导致它?也许我将环境变量设置为false?

谢谢你。

编辑

在我尝试以下操作后,使用 isql 命令起作用了: -添加以下环境变量:INFORMIXSQLHOSTS CLIENT_LOCALE DB_LOCALE ODBCINI ONCONFIG -添加 onconfig 文件并对其进行配置。- 添加 sqlhosts 文件并对其进行配置。

仍在弄清楚如何使 php 代码工作(仍然给出相同的错误)

希望有帮助。

编辑#2 通过终端运行 php 可以工作,并且我可以使用以前的数据库成功查询 informix 数据库,只有当我通过浏览器调用 php 代码(使用 apache)时它才不起作用。

正如其他人在ls -l一篇文章中所建议的那样,这是在驱动程序库所在的目录中运行所产生的结果:

[root@administration-pc cli]# ls -l
total 21748
-rwxr-xr-x 3 informix informix 1865750 Jun 25  2018 iclis09b.so
-rwxrwxrwx 3 informix informix 1907069 Jun 25  2018 iclit09b.so
-rwxr-xr-x 2 informix informix   32805 Jun 25  2018 idmrs09a.so
-rw-r--r-- 2 informix informix 3595434 Jun 25  2018 libcli.a
-rw-r--r-- 2 informix informix   32864 Jun 25  2018 libdmr.a
-rw-r--r-- 2 informix informix 3595434 Jun 25  2018 libifcli.a
-rwxr-xr-x 3 informix informix 1865750 Jun 25  2018 libifcli.so
-rw-r--r-- 2 informix informix   32864 Jun 25  2018 libifdmr.a
-rwxr-xr-x 2 informix informix   32805 Jun 25  2018 libifdmr.so
-rwxr-xr-x 3 informix informix 1865750 Jun 25  2018 libixcli.so
-rwxrwxrwx 3 informix informix 1907069 Jun 25  2018 libtcli.so
-rw-r--r-- 1 informix informix 3593510 Jun 25  2018 libthcli.a
-rwxrwxrwx 3 informix informix 1907069 Jun 25  2018 libthcli.so
-rw-r--r-- 1 root     root           8 Mar 13 16:22 sample.txt

这是 apache 的 phpinfo() 结果这里是通过终端运行的php

我也跑exec('whoami')了两个,apache当终端返回时 apache 返回root

我尝试改变它httpd.confUserroot不是apache让我不再启动 apache。

此外,将权限更改iclis09b.so为 apache 似乎也不起作用。

编辑#3(解决方案)

Apache 显然无法访问环境变量,因此您必须将所有环境变量添加到其中...

我的位于/etc/sysconfig/httpd...

标签: phpodbccentos7informix

解决方案


您提到的所有参考片段都指向直接使用 Informix ODBC 驱动程序,这非常好。我找不到可能导致您遇到错误的代码段的任何问题。此时我对错误文本片段[unixODBC][Driver Manager]有点困惑。我的意思是,当应用程序直接引用 Informix ODBC 驱动程序时,不应该出现 unixODBC 驱动程序管理器。您可以尝试使用以下值的LD_LIBRARY_PATH吗?

export LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:${INFORMIXDIR}/lib/cli

仅供参考:由于您已经创建了一个 DSN(使用 INI 文件),您可以在 PHP 应用程序使用的连接字符串中指定 DSN 名称,例如:

"DSN=informix_db; uid=xxx; pwd=xxxx;"

如果您想尝试使用纯 ODBC 示例应用程序连接(我的意思是在 PHP 环境之外)进行故障排除,那么这里是 ODBC 应用程序示例代码。 https://github.com/OpenInformix/ODBCExamples/blob/master/src/IfxOdbcSample1.c

https://github.com/OpenInformix/ODBCExamples/blob/master/src/odbc.ini

https://github.com/OpenInformix/ODBCExamples/blob/master/src/makefile

https://github.com/OpenInformix/ODBCExamples/blob/master/src/envc.bsh


推荐阅读