2012-06-27 55 views
2

我在RHEL 5上使用PHP 5.3.3。我已經安裝了用於連接到Teradata的ODBC的所有必需驅動程序和附件。我寫了一個簡單的腳本來測試它:PHP odbc_exec成功將odbc_connect連接到Teradata後出現分段錯誤14.0

$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連接持久)

hereSegmentation故障


顯然連接工作。我也嘗試過其他命令,一些工作,一些不工作。 odbc_tables()odbc_procedures()返回正確的信息沒有問題。但是,與SQL查詢相關的任何內容都會導致seg故障。我無法獲取跟蹤/調試以打開ODBC。

任何幫助將不勝感激!

回答

0

你可以做三件事。首先,(假設你使用的unixODBC)找到你的ODBCINST.INI文件並添加:

[ODBC] 跟蹤= YES TRACEFILE =的/ tmp/unixodbc.log

運行PHP腳本的命令行你應該得到一個日誌。如果它是在unixODBC或ODBC驅動程序中進行segfaulting,則最後一行應該顯示一個ODBC API的入口,但不會退出。但是,這隻會讓你知道它失敗的原因。

你可以做的第二件事就是尋找到你的PHP可執行文件,並在調試器下運行它:

GDB /路徑/到/ PHP

當你的提示做:

[R/path/to/my/php_script

當seg故障使用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日誌文件的結尾,我可以提供幫助。

1

我遇到了這個問題,使用resultset兩次爲兩個不同的odbc_exec's。已在每個odbc_exec之前執行unset($res),因此odbc_exec始終使用乾淨變量開始。

我還沒有很好地解釋了「爲什麼」(可能是以前resultset變量需要正確的「關閉」 ...?),但是這可以防止我的分段錯誤

0

我以前見過這個問題(特別是與Teradata ODBC連接),並記住必須修補並構建自定義PHP可執行文件才能使其正常工作。我很早就知道細節,但記住它是由於PHP的ODBC_pconnect和TD驅動程序出現問題。似乎PHP的odbc_connect也使用odbc_pconnect所以從來沒有工作 - 一旦odbc_connect被修補以刪除odbc_pconnect我可以按預期使用PHP。

對不起,如果這是一個亂七八糟的混亂,希望它會給你一些指針...