【问题标题】:PHP odbc_exec Segmentation Fault after successful odbc_connect to Teradata 14.0成功 odbc_connect 到 Teradata 14.0 后 PHP odbc_exec 分段错误
【发布时间】:2012-06-29 05:13:22
【问题描述】:

我在 RHEL 5 上使用 PHP 5.3.3。我已经安装了所有必要的驱动程序和附加组件,以便 ODBC 连接到 Teradata。我写了一个简单的脚本来测试它:

$con_string = "DRIVER={Teradata};DBCName=**HOST**; DATABASE=**database**;";
$con = odbc_pconnect( $con_string , "user", "pass" );
var_dump($con);
echo 'here';
$res = odbc_exec($con, "SELECT id FROM database.table");
echo 'there';
var_dump($res);

输出如下:

resource(5) 类型(odbc 链接持久)

这里分段错误


显然连接有效。我也尝试过其他命令,有些可以,有些不行。 odbc_tables()odbc_procedures() 返回正确的信息没有问题。但是,与 SQL 查询相关的任何内容都会出现段错误。我无法为 ODBC 启用跟踪/调试。

任何帮助将不胜感激!

【问题讨论】:

    标签: php odbc teradata


    【解决方案1】:

    你可以做三件事。首先,(假设您使用的是 unixODBC)找到您的 odbcinst.ini 文件并添加:

    [ODBC] 跟踪=是 TraceFile=/tmp/unixodbc.log

    从命令行运行你的 PHP 脚本,你应该会得到一个日志。如果它在 unixODBC 或您的 ODBC 驱动程序中出现段错误,则最后一行应显示进入 ODBC API 但没有退出。但是,这只会让您知道失败的地方。

    您可以做的第二件事是找到您的 php 可执行文件的位置并在调试器下运行它:

    gdb /path/to/php

    当你得到提示时:

    r /path/to/my/php_script

    当它出现段故障时,使用回溯 (bt) 命令来显示它发生故障的位置。

    最后,您可以拥有一个 teradata ODBC 驱动程序,该驱动程序不是使用相同的 ODBC 标头构建或定义为 PHP 和 unixODBC。这很难发现,但如果您使用的是 64 位机器,这是可能的。您可以使用 unixODBC 的 odbc_config 命令来了解 unixODBC 是如何构建的。特别是 odbc_config --ulen 和 --cflags。不幸的是,大多数基于 debian 的发行版还不包括 odbc_config - 也许你会在 redhat 上更幸运。您正在寻找的是使用 32 位 SQLULEN 和使用 64 位的 unixODBC/PHP 构建的 teradata - 如果您遇到这种情况,您肯定会遇到段错误。如果这是您的问题,您需要从 teradata 获取正确的构建版本或将所有内容切换到 32 位二进制文​​件。

    有了这些信息,您或许能够找出问题所在。您可以随时发布 gdb 回溯或 unixODBC 日志文件的结尾,我可能会提供帮助。

    【讨论】:

      【解决方案2】:

      我在为两个不同的odbc_exec 使用两次resultset 时遇到了这个问题。在每个odbc_exec 之前执行unset($res) 已解决,因此odbc_exec 始终开始使用干净的变量。

      我还没有很好的解释“为什么”(可能以前的 resultset 变量需要正确的“关闭”...?),但这可以防止我的分段错误

      【讨论】:

      • 它也解决了我同样的问题。我关闭了所有语句,它起作用了。
      【解决方案3】:

      我之前已经看到过这个问题(特别是 Teradata ODBC 连接),并且记得必须修补和构建自定义 PHP 可执行文件才能使其正常工作。我对细节很了解,因为它是前一段时间的,但请记住它是由于 PHP 的 ODBC_pconnect 和 TD 驱动程序的问题。似乎 PHP 的 odbc_connect 也使用 odbc_pconnect 所以从来没有用过 - 一旦 odbc_connect 被修补以删除 odbc_pconnect 我可以按预期使用 PHP。

      对不起,如果这是一个漫无边际的混乱,希望它能给你一些指导......

      【讨论】:

        猜你喜欢
        • 2013-11-05
        • 2018-09-27
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        相关资源
        最近更新 更多