用于查询unixODBC的PHP脚本在浏览器中失败,但可在Linux命令提示符下工作

用于查询unixODBC的PHP脚本在浏览器中失败,但可在Linux命令提示符下工作,php,apache,odbc,centos7,Php,Apache,Odbc,Centos7,我已在CentOS7服务器上正确设置了unixODBC,以使用我的Transoft ODBC驱动程序,并且我可以通过以下命令在根目录下使用它成功连接和查询我尝试访问的数据库: isql -v 'DSN' 'user' 'pwd' 接下来,我创建了一个PHP脚本来运行查询 $connect = odbc_connect("integra.udd","user","pwd"); $query = "SELECT Company1,Product,Vendor,Description1 FROM I

我已在CentOS7服务器上正确设置了unixODBC,以使用我的Transoft ODBC驱动程序,并且我可以通过以下命令在根目录下使用它成功连接和查询我尝试访问的数据库:

isql -v 'DSN' 'user' 'pwd'
接下来,我创建了一个PHP脚本来运行查询

$connect = odbc_connect("integra.udd","user","pwd");
$query = "SELECT Company1,Product,Vendor,Description1 FROM ICMAST WHERE Company1=1 LIMIT 5";
$result = odbc_exec($connect, $query);
while(odbc_fetch_row($result)){
  $product = odbc_result($result, 2);
  $desc = odbc_result($result, 4);
  print "\n$product $desc<br />";
}
它返回文件存在,因此即使Apache正在执行脚本,PHP也可以看到它

我放弃了它是SELinux或防火墙的想法,因为它甚至没有到达尝试连接的点,当它尝试查找共享对象库文件时失败。因此,问题必须是服务器内部的

最后,我认为这可能与共享库路径有关,即使它正在查看错误中文件的实际路径,但没有找到它。因此,我尝试将以下行添加到我的PHP脚本中,以设置
LD\u LIBRARY\u路径

putenv("LD_LIBRARY_PATH=/usr/usql/sqlaccess/");
没有更改,仍然给出文件未找到错误

我确信这很简单,因为我完全是Linux初学者,但我不知道下一步该做什么。有什么想法吗?运行PHP脚本的用户和运行PHP脚本的Apache之间还有什么不同

编辑以添加
libtsodbc.so
php
httpd
文件命令输出:

[root@intranetserver /]# file /usr/usql/sqlaccess/libtsodbc.so
/usr/usql/sqlaccess/libtsodbc.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
[root@intranetserver /]# file /usr/bin/php
/usr/bin/php: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=70ddc88b357d818240da4d4b3db50790c7913822, stripped
[root@intranetserver /]# file /usr/sbin/httpd
/usr/sbin/httpd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0890c878aa1d1a620d5c65d25a13d11cc2fdf96a, stripped

在我看来可能是咬错了

检查这些命令的输出。他们应该都匹配--


我最初也怀疑不匹配,特别是在设置unixODBC时,我的libtsodbc.so文件是32位的,我有一个类似的错误(找不到文件),所以我必须从Transoft获得一个64位驱动程序。当我能够在命令提示符下成功地运行php脚本时,我知道php也是64位的,但我不确定httpd。我在这三个文件上都运行了file命令,它们都是ELF 64位LSB共享对象文件。当我运行file命令时,它显示与上面相同的内容:64位。好处是,在研究这个问题的过程中,我学到了很多关于Apache如何运行PHP的知识。谢谢我在终端和apache上都运行了exec('whoami');apache返回apache和终端retuens root。。。不幸的是,将驱动程序权限更改为apache不起作用,并且在httpd.conf中将用户更改为root会在我尝试启动apache时出错……通过命令行
php
执行操作与通过
apache
mod_php5
模块执行操作非常不同。当发现一个或另一个(
php
mod_php5
)而不是两者都有问题时,比较这些问题的
php_info()
输出是一个有用的步骤。运气好吗?我有完全相同的问题;我可以从终端运行php脚本,但不能从apache运行。。。查看phpinfo(),它们都使用相同的php。ini@A.JAlhorr-一个新问题可能适合你。要在这方面取得进一步进展,可能需要完整输出
phpinfo()
。(指导下。)用户
apache
需要所有相关库的读取和执行权限,包括
libtsodbc.so
(因此可能需要提供
ls-l/usr/usql/sqlaccess/libtsodbc.so
输出)。@Talled非常感谢您的回复;事实上,我已经有了一个关于堆栈溢出的问题,并对其进行了编辑,以包括您建议的所有内容。这个旧问题可能会由新问题来回答-
LD\u LIBRARY\u PATH
设置需要进入
httpd
配置。
[root@intranetserver /]# file /usr/usql/sqlaccess/libtsodbc.so
/usr/usql/sqlaccess/libtsodbc.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
[root@intranetserver /]# file /usr/bin/php
/usr/bin/php: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=70ddc88b357d818240da4d4b3db50790c7913822, stripped
[root@intranetserver /]# file /usr/sbin/httpd
/usr/sbin/httpd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0890c878aa1d1a620d5c65d25a13d11cc2fdf96a, stripped
file /usr/usql/sqlaccess/libtsodbc.so

file `which php`      # the runtime PHP

file `which httpd`    # the typical name of the apache executable

find / -name mod_php -exec file {} \;    
     # mod_php is the PHP module for Apache
     # if you know where mod_php is on your box, you can just do
     #     file /path/to/mod_php