普适的SQL驱动程序

时间:2012-08-10 10:10:15

标签: php ubuntu odbc pervasive

更新:应该按照建议在serverfault上。新帖子:https://serverfault.com/questions/451220/psql-64bit-driver-error

我很难让PHP使用Pervasive SQL驱动程序连接ODBC。

我有一个Ubuntu Server 12.04并且从这里安装了64位PSQL Client驱动程序: http://www.pervasivedb.com/psqlv11/Pages/PSQL-v11-Linux-Downloads.aspx

我已将带有DSN的ODBC.ini设置到我的数据库,我可以愉快地连接然后运行查询:

isql Exchequer

当我使用PHP时,odbc_connect看起来没问题并给我一个资源,但是odbc_exec(调用驱动程序的点)然后完全失败(SEG错误):

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

我做错了什么?

更新:

这是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)

我还在Trace / TraceFile中添加了但我似乎没有将任何输出保存到日志文件中。

更新2:

这是我正在运行的简化脚本:

if(!$ odbc = odbc_connect(“exchequer”,“username”,“password”)){     死(“与财政联系失败”); } $ 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日志文件中看到“退出信号Segmentation fault”。

1 个答案:

答案 0 :(得分:1)

它可能只是您正在使用的某个组件中的一个错误,但我最好的猜测是,在编译时,SQLLEN / SQLULEN的大小与组件不匹配。您可以在unixODBC中启用日志记录,它可能会给我们一个提示。编辑odbcinst.ini文件并将以下内容添加到顶部:

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

如果你不知道你需要编辑哪个odbcinst.ini文件运行odbcinst -j它会告诉你。现在运行PHP脚本,上面的文件应该包含日志。

或者,您可以在调试器(gdb)下运行php并查看它的落脚点。为此,您需要找到您的php可执行文件的位置并运行类似:

gdb /path/to/php

然后键入“run / path / to / my / php / script”,当它落在“bt”类型上以获得一个后退跟踪,它将告诉我们它在哪里倒下。

但是,如果它是SQLLEN / SQLULEN不匹配,则可能会发生损坏,这可能意味着它会在与问题出现完全不同的地方出现故障。您需要验证PHP的ODBC模块,unixODBC和您的ODBC驱动程序都是使用SQLLEN和SQLULEN构建的,大小相同。我猜你是否从Ubuntu安装了unixODBC和PHP然后它们会匹配,所以奇怪的那个将是你需要问他们的Pervasive驱动程序。

odbcinst -j输出使用unixODBC构建的SQLLEN / SQLULEN的大小。

您可以在64-bit ODBC

找到更多相关信息