无法在Ubuntu上使用PHP和ODBC连接到SQL Anywhere 12

时间:2014-02-05 01:17:47

标签: php ubuntu odbc sybase sqlanywhere

我正在尝试在Ubuntu 12.04上安装PHP 5.3.10,以使用ODBC(unixODBC)连接到远程SQL Anywhere 12(Sybase?)服务器。但是,PHP的执行在odbc_connect()停止。

PHP代码:

$odbc = odbc_connect('DSN=TP189902;', 'username', 'password');

if ($odbc)
{
    echo 'Connected';
}
else
{
    echo 'Failed: '.odbc_error($odbc);
}

因此无论它是否连接,它都应该输出一个回声,但它不会。如果我尝试使用PHP的PDO库,我会得到相同的结果。

我的unixODBC设置如下所示。这可能是我的错误所在,因为我以前从未在Linux上设置过ODBC,并且对它不是很熟悉。

ODBCINST.INI

[SQL Anywhere 12]
Description = SQL Anywhere 12
Driver = /opt/sqlanywhere12/lib64/libdbodbc12.so
Setup  = /opt/sqlanywhere12/lib64/libdbodbc12.so

ODBC.INI

[TP189902]
Description = TP189902
Uid = username
Pwd = password
Driver = SQL Anywhere 12
ServerName = 189902
CommLinks = tcpip(Host=1.2.3.4)
DatabaseName = DB189902

我也尝试了很多替代方案,例如使用驱动程序路径获取Driver值,使用Host = 1.2.3.4而不是CommLinks等。

此外,命令isql -v TP189902 username password不输出任何内容,除非我给它一个假的DSN,以便输出和错误。

我还验证了libdbodbc12.so与isql的架构相同,并且它具有所有依赖项。

除此之外,我在运行WAMP的Windows 7机器上有非常类似的设置,它连接得很好(同时使用ODBC和PDO库)。我在其上使用了相同的DSN详细信息。

编辑:我也试过这个跳过DSN,但它给出了相同的结果。它也适用于Windows机箱。

$odbc = odbc_connect('Driver={SQL Anywhere 12};Server=189902;CommLinks=tcpip(Host=1.2.3.4);', 'username', 'password');

2 个答案:

答案 0 :(得分:1)

这些天我不使用PHP,但这里有一些我发现的东西:

  1. 在完成isql工作之前,我会完全忽略php。
  2. 我认为这是一个错字,你说你的系统ini文件是“odbcinstr.ini” - 它应该是“odbcinst.ini”。
  3. 你怎么知道你正在查看正确的odbc ini文件 - 运行odbcinst -j来检查unixODBC正在使用的位置。
  4. 我知道“[ODBC数据源]”部分来自哪里(iodbc),但它根本不是unixODBC所必需的 - 只需删除odbc.ini文件的前两行。
  5. 您的isql行可能缺少用户名和密码 - 它应该是“isql -v TP189902用户名密码”。我不能为我的生活看到为什么它根本不输出任何东西。

答案 1 :(得分:0)

最终问题是将LD_LIBRARY_PATH设置为Apache的/ opt / sqlanywhere12 / lib64。

在/ etc / environment中设置isql -v TP189902和php connect.php在从任何shell用户调用时工作,但不是Apache。

要让Apache看到它,我必须编辑/etc/init.d/apache2并更改
    ENV="env -i LANG=C PATH=/usr/local/bin:/usr/bin:/bin"

ENV="env -i LANG=C PATH=/usr/local/bin:/usr/bin:/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/sqlanywhere12/lib64"
然后重启Apache服务。 我在网上找到的其他各种方法都不起作用。

有一点需要注意,在路径设置的情况下,由于某种原因,unixODBC仍然无法读取我的系统DSN文件。因此,要让Apache访问DSN,我必须在/ var / www中创建一个用户DSN文件(.odbc.ini),因为这是Apache用户的(www-data)主文件夹。