我正在尝试在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');
答案 0 :(得分:1)
这些天我不使用PHP,但这里有一些我发现的东西:
答案 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)主文件夹。