Can';在Ubuntu上使用PHP和ODBC连接到SQLAnywhere 12

Can';在Ubuntu上使用PHP和ODBC连接到SQLAnywhere 12,php,ubuntu,odbc,sybase,sqlanywhere,Php,Ubuntu,Odbc,Sybase,Sqlanywhere,我正在尝试在Ubuntu 12.04上安装PHP5.3.10,以便使用ODBC(unixODBC)连接到远程SQLAnywhere 12(Sybase?)服务器。但是,PHP的执行在odbc_connect()处停止 PHP代码: $odbc = odbc_connect('DSN=TP189902;', 'username', 'password'); if ($odbc) { echo 'Connected'; } else { echo 'Failed: '.odbc_e

我正在尝试在Ubuntu 12.04上安装PHP5.3.10,以便使用ODBC(unixODBC)连接到远程SQLAnywhere 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
[TP189902]
Description = TP189902
Uid = username
Pwd = password
Driver = SQL Anywhere 12
ServerName = 189902
CommLinks = tcpip(Host=1.2.3.4)
DatabaseName = DB189902
odbc.ini

[SQL Anywhere 12]
Description = SQL Anywhere 12
Driver = /opt/sqlanywhere12/lib64/libdbodbc12.so
Setup  = /opt/sqlanywhere12/lib64/libdbodbc12.so
[TP189902]
Description = TP189902
Uid = username
Pwd = password
Driver = SQL Anywhere 12
ServerName = 189902
CommLinks = tcpip(Host=1.2.3.4)
DatabaseName = DB189902
我还尝试了很多替代方法,比如使用驱动程序路径作为驱动程序值,使用Host=1.2.3.4代替CommLinks,等等

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

我还验证了libdbodbc12.so是与isql相同的体系结构,并且它具有所有的依赖关系

除此之外,我在运行WAMP的Windows7机器上有非常相似的设置,连接很好(使用ODBC和PDO库)。我在上面使用了相同的DSN细节

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

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

我现在不使用PHP,但我发现了一些东西:

  • 在isql开始工作之前,我会完全忽略php
  • 我假设你说你的系统ini文件是“odbcinstr.ini”是一个打字错误——它应该是“odbcinst.ini”
  • 您如何知道您正在查看正确的ODBCINI文件?运行odbcinst-j检查unixODBC正在使用的位置
  • 我知道“[ODBC Data Sources]”部分的来源(iodbc),但它对于unixODBC完全没有必要-只需删除ODBC.ini文件的前2行即可
  • 您的isql行可能缺少用户名和密码-它应该是“isql-v TP189902用户名密码”。我一辈子都不明白为什么它什么都不输出

  • 最终的问题是将Apache的LD_LIBRARY_路径设置为/opt/sqlanywhere12/lib64

    在/etc/environment中设置它可以让isql-VTP189902和PHPConnect.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\u LIBRARY\u PATH=$LD\u LIBRARY\u PATH:/opt/sqlanywhere 12/lib64”

    然后重新启动Apache服务。 我在网上找到的各种其他方法都不起作用


    一个警告是,设置了路径后,unixODBC出于某种原因仍然不会读取我的系统DSN文件。因此,为了让Apache访问DSN,我必须在/var/www中创建一个用户DSN文件(.odbc.ini),因为这是Apache用户(www数据)的主文件夹

    谢谢你的回复。由于字符限制,正在拆分以下内容。。。1.每次我进行更改并重试时,我都会同时尝试php和isql,因为我不确定isql是否应该输出任何内容。2.是的,这是文章中的输入错误,但是实际的文件名拼写正确。请输入isql-v TP189902用户名密码,然后告诉我发生了什么。您应该得到一个输入SQL的错误或提示。如果您既没有得到strace-o x.log,请运行strace-o x.log isql-v TP189902 username password并将日志文件发布到我可以看到的某个地方。它成功地打开了/opt/sqlanywhere 12/lib64/libdbodbc12.so,但libdbodbc12_r.so却从不同的位置失败了。在/opt/sqlanywhere12/lib64/libdbodbc12.so上运行ldd,它应该会显示它所依赖的内容和缺少的内容。让我在/opt/sqlanywhere12/lib64/libdbodbc12.so上查看ldd输出,然后如果它确实列出了libdbodbc12.so所在的位置,则在该文件上运行ls-la以查看权限。您的策略清楚地显示了一些内容(动态链接器)反复尝试查找libdbodbc12_r.so并失败。通常_r表示库的线程安全版本。在您尚未找到的某个地方,必须存在对此库的引用/依赖关系。尝试确保环境变量LD_LIBRARY_PATH设置为/opt/sqlanywhere12/lib64/并在运行isql之前导出它。