我在RHEL 5上使用PHP 5.3.3。我已经为Teradata的ODBC连接安装了所有必需的驱动程序和附加组件。我写了一个简单的脚本来测试它:
$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);
输出如下:
类型的资源(5)(odbc link persistent)
hereSegmentation fault
显然连接有效。我也尝试过其他命令,有些是工作,有些则没有。 odbc_tables()
和odbc_procedures()
会毫无问题地返回正确的信息。但是,与SQL查询相关的任何内容都会出现seg错误。我无法为ODBC打开跟踪/调试。
非常感谢任何帮助!
答案 0 :(得分:2)
对于两个不同的resultset
使用odbc_exec
两次,我遇到了这个问题。已解决在unset($res)
之前执行odbc_exec
,因此odbc_exec
始终使用干净变量开始。
我还没有一个很好的解释'为什么'(可能以前的resultset
变量需要正确的'关闭'......?),但这可以防止我的分段错误
答案 1 :(得分:0)
你可以做三件事。首先,(假设您使用的是unixODBC)找到您的odbcinst.ini文件并添加:
[ODBC] 跟踪= YES TRACEFILE = / TMP / unixodbc.log
从命令行运行PHP脚本,你应该得到一个日志。如果它是unixODBC或您的ODBC驱动程序中的segfaulting,则最后一行应显示ODBC API的条目但不退出。但是,这只能告诉你它失败的地方。
你可以做的第二件事就是找到php可执行文件的位置并在调试器下运行它:
gdb / path / to / php
当你收到提示时:
r / path / to / my / php_script
当它出现故障时,使用back trace(bt)命令显示它爆炸的位置。
最后,您可以使用teradata ODBC驱动程序,该驱动程序不是使用相同的ODBC标头构建的,也不是定义为PHP和unixODBC。这是非常棘手的发现,但如果你在64位机器上,这是一种可能性。您可以使用unixODBC的odbc_config命令来了解如何构建unixODBC。特别是odbc_config --ulen和--cflags。不幸的是,大多数基于debian的发行版还没有包含odbc_config - 可能你会对redhat更幸运。你正在寻找的东西是使用SQLULEN 32位构建的teradata和64位的unixODBC / PHP - 如果你遇到这种情况,你肯定会遇到段错误。如果这是您的问题,您需要从teradata获取正确的版本或将所有内容切换为32位二进制文件。
有了这些信息,你可能会发现出了什么问题。您可以随时发布gdb返回跟踪或unixODBC日志文件的结尾,我可能会提供帮助。
答案 2 :(得分:0)
我以前见过这个问题(特别是Teradata ODBC连接)并且记得必须修补和构建自定义PHP可执行文件才能使其正常工作。我对前面的细节很了解,但是由于PHP的ODBC_pconnect和TD驱动程序存在问题而记得它。似乎PHP的odbc_connect也使用odbc_pconnect,所以从来没有工作 - 一旦odbc_connect被修补删除odbc_pconnect我可以按预期使用PHP。
对不起,如果这是一个漫无边际的混乱,希望它会给你一些指示......