2012-08-10 96 views
1

更新:應按照建議在serverfault上。新帖子在這裏:https://serverfault.com/questions/451220/psql-64bit-driver-error普適SQL驅動程序

我很難讓PHP使用Pervasive SQL驅動程序連接ODBC。

我有一個Ubuntu服務器12.04,並且已經安裝在這裏的64位PSQL客戶端驅動程序: http://www.pervasivedb.com/psqlv11/Pages/PSQL-v11-Linux-Downloads.aspx

我安裝我的ODBC.INI與DSN到我的數據庫,我可以愉快地進行連接,然後運行查詢:

isql Exchequer 

當我使用PHP,odbc_connect看起來不錯,給我的資源,但odbc_exec(在駕駛員叫點),然後完全失敗(SEG故障):

[Fri Aug 10 11:05:50 2012] [notice] child pid 13770 exit signal Segmentation fault (11) 

我做錯了什麼?

UPDATE:

下面是從gdb的

(gdb) run /var/www/default/scripts/stock/index.php 
Starting program: /usr/bin/php5 /var/www/default/scripts/stock/index.php 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
[New Thread 0x7fffecc89700 (LWP 14514)] 
[Thread 0x7fffecc89700 (LWP 14514) exited] 
Halt[Inferior 1 (process 14513) exited normally] 
(gdb) bt 
No stack. 

輸出和PHP的error.log進入

[Fri Aug 10 15:24:53 2012] [notice] child pid 14510 exit signal Segmentation fault (11) 

我也是在跟蹤/跟蹤文件添加,但我不知道似乎得到任何輸出保存到日誌文件。

更新2:

這是簡化的腳本我運行:

如果($ ODBC = odbc_connect( 「金庫」, 「用戶名」, 「密碼」)!){ 模(「連接到國庫失敗」); } $ rows = odbc_exec($ odbc,'SELECT sl.slStockCode,sl.slQtyInStock,sl.slQtyAllocated,sl.slLocCode FROM StockLocation sl WHERE sl.slLocCode IN(\'DIG \',\'WOO \',\ 'MEN \')'); echo「

".print_r($rows,true)."
」;

odbc_connect工作(不死),但我一直在我的瀏覽器中看到錯誤342,並在apache日誌文件中「退出信號分段錯誤」。

+1

找到更多關於此的信息**這個問題不應該在** serverfault **上? – 2012-08-10 10:12:26

回答

1

它可能只是您正在使用的某個組件中的一個錯誤,但我最好猜測這是組件在編譯時與SQLLEN/SQLULEN大小不匹配的原因。您可以在unixODBC中啓用日誌記錄,它可能會給我們一個提示。編輯您的ODBCINST.INI文件並添加以下到頂端:

[ODBC] 
Trace=yes 
TraceFile=/tmp/unixodbc.log 

如果你不知道你需要編輯ODBCINST -j運行的ODBCINST.INI文件,它會告訴你。現在運行你的PHP腳本,上面的文件應該包含日誌。

或者,你可以在調試器(gdb)下運行php,看看它在哪裏跌倒。對於這一點,你就需要找到你的PHP可執行文件並運行類似:

gdb /path/to/php 

然後鍵入「運行/路徑/要/我的/ PHP /腳本」,當它倒下型「BT」到得到一個回溯,它會告訴我們它跌倒的地方。

但是,如果它是一個SQLLEN/SQLULEN不匹配損壞可能會繼續,這可能意味着它在某個地方完全不同於問題的地方。您需要驗證PHP的ODBC模塊,unixODBC和ODBC驅動程序是否都使用相同的SQLLEN和SQLULEN構建。我猜如果你在Ubuntu上安裝了unixODBC和PHP,那麼它們會匹配,所以奇怪的一個將成爲你需要詢問它們的Pervasive驅動程序。

odbcinst -j輸出unixODBC使用的SQLLEN/SQLULEN的大小。

你可以在64-bit ODBC

+0

感謝您提供全面的回覆。 odbcinst -j的輸出將大小指定爲8: root @ hub:/ var/www/default/scripts/stock#odbcinst -j unixODBC 2.2.14 DRIVERS ............ :/etc/odbcinst.ini 系統數據來源:/etc/odbc.ini FILE DATA SOURCES ..:/ etc/ODBCDataSources 用戶數據源..:/root/.odbc.ini SQLULEN大小.... ...:8 SQLLEN大小........:8 SQLSETPOSIROW大小:8 – 2012-08-10 10:50:44

+0

我也在嘗試安裝gdb軟件包時遇到錯誤: apt-get:/ usr/local/psql/lib64/libstdC++。so.6:未找到'GLIBCXX_3.4.9'版本(需要apt-get) apt-get:/usr/local/psql/lib64/libstdc++.so.6:版本'GLIBCXX_3.4.15'not發現(需要apt-get) apt-get:/usr/local/psql/lib64/libstdc++.so.6:未找到版本'GLIBCXX_3.4.11'(需要apt-get) apt-get:/ usr/local/psql/lib64/libstdC++ .so.6:未找到版本'GLIBCXX_3.4.11'(需要/usr/lib/x86_64-linux-gnu/libapt-pkg.so.4.12) 未找到'GLIBCXX_3.4.15'(必需的/ usr/lib /x86_64-linux-gnu/libapt-pkg.so.4.12) – 2012-08-10 10:51:32

+0

因此,如果ODBC驅動程序是以4字節的大小構建的,那麼您會受到損壞。這並不罕見。你應該能夠與Pervasive進行覈對。但你可能仍然想嘗試trace和gdb,因爲它可能是別的。 – bohica 2012-08-10 10:52:37

相關問題