2012-08-10 57 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

相关问题