3

我在 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 打开跟踪/调试。

任何帮助将不胜感激!

4

3 回答 3

2

resultset我在两次使用两个不同odbc_exec的 's时遇到了这个问题。它unset($res)在每个之前都解决了,odbc_exec所以odbc_exec总是开始使用一个干净的变量。

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

于 2013-10-20T19:34:54.760 回答
0

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

[ODBC] Trace=是 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 日志文件的结尾,我可能会提供帮助。

于 2012-06-28T08:17:48.123 回答
0

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

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

于 2017-01-16T08:37:12.487 回答