【问题标题】:Can't connect to SQL Anywhere 12 with PHP and ODBC on Ubuntu无法在 Ubuntu 上使用 PHP 和 ODBC 连接到 SQL Anywhere 12
【发布时间】:2014-03-01 06:29:59
【问题描述】:

我正在尝试在 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

我还尝试了很多替代方法,例如使用驱动程序的路径作为驱动程序值,使用 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');

【问题讨论】:

    标签: php ubuntu odbc sybase sqlanywhere


    【解决方案1】:

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

    1. 在 isql 正常工作之前,我会完全忽略 php。
    2. 我假设您说您的系统 ini 文件是“odbcinstr.ini”是一个错字 - 它应该是“odbcinst.ini”。
    3. 您怎么知道您正在查看正确的 odbc ini 文件 - 运行 odbcinst -j 以检查 unixODBC 正在使用的位置。
    4. 我知道“[ODBC 数据源]”部分的来源 (iodbc),但对于 unixODBC 完全没有必要 - 只需删除 odbc.ini 文件的前 2 行即可。
    5. 您的 isql 行可能缺少用户名和密码 - 它应该是“isql -v TP189902 用户名密码”。我终其一生都无法理解为什么它什么都不会输出。

    【讨论】:

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

    最终问题在于将 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) 的主文件夹。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多