无法通过 linux 机器上的 ODBC 连接到 informix
Cannot Connect to informix through ODBC on linux machine
我在运行 CentOS 7 的虚拟机上工作,我正在尝试通过一些 php.
使用 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
我在 similar question 上读到这可能是由于 DriverVersion 错误导致的,所以我在 odbcinst.ini.
我是 linux 的新手,不知道是什么其他问题导致的?也许我将环境变量设置为 false?
谢谢。
编辑
在我尝试了以下操作后,使用 isql 命令成功了:
- 添加以下环境变量:INFORMIXSQLHOSTS
CLIENT_LOCALE
DB_LOCALE
ODBCINI
ONCONFIG
- 添加 onconfig 文件并配置它。
- 添加sqlhosts文件并配置它。
仍在弄清楚如何使 php 代码工作(仍然给出相同的错误)
希望对您有所帮助。
编辑#2
运行 php 通过终端工作,我可以使用以前的数据库成功查询 informix 数据库,它只在我通过浏览器调用 php 代码时不起作用(使用 apache ).
正如某人在 different post 上所建议的,这里是驱动程序库所在目录中 运行ning 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
和 here is result of phpinfo() for apache; and here php 运行 通过终端机。
我也 运行 exec('whoami')
和 apache returns apache
而终端 returns root
.
我尝试更改 httpd.conf
以便 User
是 root
而不是 apache
让我可以再启动 apache。
同时将 iclis09b.so
的权限更改为 apache 似乎也不起作用。
编辑#3(解决方案)
Apache 显然无法访问环境变量,因此您必须向其添加所有环境变量...
我的位于 /etc/sysconfig/httpd
...
您提到的所有参考片段都指向直接使用 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
我在运行 CentOS 7 的虚拟机上工作,我正在尝试通过一些 php.
使用 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
我在 similar question 上读到这可能是由于 DriverVersion 错误导致的,所以我在 odbcinst.ini.
我是 linux 的新手,不知道是什么其他问题导致的?也许我将环境变量设置为 false?
谢谢。
编辑
在我尝试了以下操作后,使用 isql 命令成功了:
- 添加以下环境变量:INFORMIXSQLHOSTS
CLIENT_LOCALE
DB_LOCALE
ODBCINI
ONCONFIG
- 添加 onconfig 文件并配置它。
- 添加sqlhosts文件并配置它。
仍在弄清楚如何使 php 代码工作(仍然给出相同的错误)
希望对您有所帮助。
编辑#2 运行 php 通过终端工作,我可以使用以前的数据库成功查询 informix 数据库,它只在我通过浏览器调用 php 代码时不起作用(使用 apache ).
正如某人在 different post 上所建议的,这里是驱动程序库所在目录中 运行ning 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
和 here is result of phpinfo() for apache; and here php 运行 通过终端机。
我也 运行 exec('whoami')
和 apache returns apache
而终端 returns root
.
我尝试更改 httpd.conf
以便 User
是 root
而不是 apache
让我可以再启动 apache。
同时将 iclis09b.so
的权限更改为 apache 似乎也不起作用。
编辑#3(解决方案)
Apache 显然无法访问环境变量,因此您必须向其添加所有环境变量...
我的位于 /etc/sysconfig/httpd
...
您提到的所有参考片段都指向直接使用 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