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

2023-12-22

我在我的 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 />";
}

如果我使用 root 在 root 中执行此操作PHP odbctest.php,它有效,我得到了我应该得到的结果。此外,我可以使用 apache 用户su -s /bin/bash apache并运行它,它就可以工作了。 (我验证Apache服务器使用apache作为用户运行命令echo exec ('whoami');在 PHP 脚本中)

但是,如果我转到浏览器并运行它,则会收到以下错误:

Warning: odbc_connect(): SQL error: [unixODBC][Driver Manager]Can't open lib '/usr/usql/sqlaccess/libtsodbc.so' : file not found, SQL state 01000 in SQLConnect in /var/www/html/2m/odbctest.php on line 10

使用 Apache 运行时找不到共享对象文件,但从任何用户运行时都可以找到。

首先,我假设存在权限问题,因此我更改了所有权libtsodbc.so文件到apache:apache。不用找了。

然后我检查了文件的权限,它设置为555,因此应该可由用户执行。

然后我尝试在浏览器中运行 PHP 脚本来检查该文件是否存在于该路径中。这是我运行的脚本:

<?php
$filename = '/usr/usql/sqlaccess/libtsodbc.so';
if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

它返回该文件存在,因此即使 Apache 正在执行脚本,PHP 也可以看到它。

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

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

putenv("LD_LIBRARY_PATH=/usr/usql/sqlaccess/");

没有改变,仍然给出文件未找到的错误。

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

编辑添加 libtsodbc.so, php, and 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于查询 unixODBC 的 PHP 脚本在浏览器中失败,但可以在 Linux 命令提示符下运行 的相关文章

  • 让我的函数访问外部变量

    我外面有一个数组 myArr array 我想让我的函数访问其外部的数组 以便它可以向其中添加值 function someFuntion myVal some processing here to determine value of m
  • PHP Laravel:未找到特征

    我在命名空间和使用方面遇到一些问题 我收到此错误 未找到特征 Billing BillingInterface 这些是我的 Laravel 应用程序中的文件 计费 php namespace Billing BillingInterface
  • 如何在 PHP 中获取 html 中的文件路径?

    有人可以告诉我如何使用 html 获取文件路径
  • 显示标准化数据

    跟进问题 添加 2 个不同表的总和 https stackoverflow com questions 39717541 adding sum from 2 different tables 我创建了3个表 members videos v
  • 如何改变div的值[重复]

    这个问题在这里已经有答案了 div this is div a div div this is div b div 现在我怎样才能改变文本div通过单击按钮动态地进行 这里还提到所有文本都来自数据库 当我单击按钮时它会检测到divid 并将
  • 如何使用正则表达式将多个
    标签替换为一个
    标签?

    I want br br 变成 br 正则表达式的模式是什么 注 br 标签可以连续出现两次以上 html preg replace br gt s i br html 这将捕获任何组合 br br or br 它们之间有任意数量或类型的空
  • SWIG 生成的代码无法在 PHP 5.3.2 上运行未定义的符号:zend_error_noreturn

    我有一个库 在 PHP 5 1 6 生成的一些包装器代码的帮助下 我已经成功地使用了它SWIG http www swig org v1 3 40 我刚刚升级到 PHP 5 3 2 但看到以下错误 PHP Warning PHP Start
  • JqG​​rid PHP:通过工具栏过滤时突出显示结果

    我想在使用过滤器工具栏时突出显示搜索结果 我尝试使用该解决方案Oleg https stackoverflow com users 315935 oleg and 阿布舍克 西蒙 https stackoverflow com users
  • PHP 电子邮件表单每次刷新页面时都会发送电子邮件

    我的 php 电子邮件每次刷新页面时都会发送电子邮件 例如 用户正在填写表单并使用发送按钮发送 这一切都很好 但如果他们刷新页面 它会再次发送包含所有相同表单信息的电子邮件 我相信这是问题代码 但不知道它是什么 require once c
  • 不允许在 php 中连接到此 MariaDB 服务器

    我尝试在 php 中连接远程服务器数据库 但出现以下错误 Host xx xxx xx xx is not allowed to connect to this MariaDB server in 我的连接代码是这样的 servername
  • 通过CompilerPass注册自定义AttributeBag

    我正在尝试通过将自定义 AttributBags 集成到会话中来整理我的会话变量 在 Symfony 查看相关问题 如何向 symfony 会话添加额外的包 https stackoverflow com questions 4472361
  • 无法创建可锁定文件 - Laravel 8 和 PHP 8

    我被困在 Laravel 项目中 我已经使用 Laravel 很多年了 但从未发生过这种情况 我正在使用 Vagrant 一如既往 并且只在 PHP 8 中发生这种情况 使用 php 7 X 的其他项目不会发生这种情况 USER 和 GRO
  • 如何更新 Laravel 编辑视图中的图像?

    在 Laravel 中 我的编辑视图中有一个名为 个人资料图片 的字段 每当我单击 编辑 按钮时 我都会在编辑视图中从数据库中获取所有值 但没有获得图像 并且如果每当我每次单击 提交 按钮时 我都必须如果没有上传图像 我无法进一步处理我想要
  • 在 PHP 中搜索多维数组中的值并获取其路径

    这是我的数组 array array 1 gt array title gt Level1 nodes gt array 11 gt array title gt sub1 company1 12 gt array title gt sub
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • PHP 根据需要添加额外的空格

    考虑以下代码 div div search php and category php本质上是相同的结构 具有一些特定内容的 div 容器 这里没什么特别的 纯 HTML div class component div 但是 当插入时requ
  • Laravel - 保存在存储文件夹中的图像不向用户显示

    我有这段代码可以将图像保存在 storage app uploads 文件夹中 image main Image where property id id gt get file request gt file file destinati
  • 危险的 PHP 函数

    我将用户输入的 php 函数存储到 mySQL 数据库中 这些函数需要能够被执行 正如我们所知 这可以并且将会允许黑客先生将一个漂亮的网站变成瑞士奶酪 这些函数很简单 不需要任何高级的 php 编码 它们更多地涉及处理单个数据数组 因此 如
  • WordPress:wpdb->插入与wpdb->准备(wpdb->查询(“INSERT

    我想知道 WordPress 的插入功能是否也向数据添加斜杠 如果没有 准备查询方法似乎可以更好地防止 SQL 注入 我尝试在 codex api 中查找问题 然而 它似乎没有记录 谢谢 这个问题有点老了 自从提出这个问题以来 法典可能已经
  • php strtotime“上周一”如果今天是周一?

    我想用strtotime last Monday 问题是 如果今天是星期一 它会返回什么 它似乎正在返回上周星期一的日期 在这种情况下我怎样才能让它返回今天的日期 如果您阅读手册 其中有一个很好的示例 它准确地描述了您想要执行的操作http

随机推荐