0

我正在尝试在 Mac OS X 10.14 comp 上使用 ODBC。

我的开发环境有一个 nginx 网络服务器和 php 7.3.10。在遵循一些指南之后,我安装mdbtools了 odbc 支持。

isql我可以通过 odbc 名称或 DSN读取我的访问数据库。

Command: isql -v -k "Driver=MDBTools;DBQ=/database.accdb;"
Command: isql -v MyODBOrigin

使用这两个连接命令,isql连接正常,我可以使用 aSELECT * FROM MyTable查看数据。

现在,问题:

使用 PHP odbc_connect

$connection = odbc_connect('MyODBCOrigin', '', '');
$res = odbc_exec($connection, 'SELECT * FROM MyTable');
while(odbc_fetch_row($res)){
    for($i=1;$i<=odbc_num_fields($res);$i++){
        echo "Result is ".odbc_result($res,$i);
    }
}
PHP错误:
( ! ) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 21474836512 bytes) in /web/odbc.php on line 34
Call Stack
#   Time    Memory  Function    Location
1   0.0003  410408  {main}( )   .../odbc.php:0
2   0.5053  434576  odbc_result ( ) .../odbc.php:34

使用 PDO:

$connection = new \PDO('odbc:MyODBCOrigin');
$connection = new \PDO('Driver=MDBTools;DBQ=/database.accdb;');

使用这两种连接方法会导致 odbc 死掉(nginx 返回 404 错误)。

ODBC 跟踪:
[ODBC][31713][1570202266.779582][__handles.c][460]
                Exit:[SQL_SUCCESS]
                        Environment = 0x7f8844001200 [ODBC][31713][1570202266.779895][SQLSetEnvAttr.c][189]
                Entry:
                        Environment = 0x7f8844001200
                        Attribute = SQL_ATTR_ODBC_VERSION
                        Value = 0x3
                        StrLen = 0 [ODBC][31713][1570202266.779998][SQLSetEnvAttr.c][381]
                Exit:[SQL_SUCCESS] [ODBC][31713][1570202266.780138][SQLSetEnvAttr.c][189]
                Entry:
                        Environment = 0x7f8844001200
                        Attribute = SQL_ATTR_CP_MATCH
                        Value = 0x0
                        StrLen = 0 [ODBC][31713][1570202266.780217][SQLSetEnvAttr.c][381]
                Exit:[SQL_SUCCESS] [ODBC][31713][1570202266.780316][SQLAllocHandle.c][377]
                Entry:
                        Handle Type = 2
                        Input Handle = 0x7f8844001200 [ODBC][31713][1570202266.780419][SQLAllocHandle.c][493]
                Exit:[SQL_SUCCESS]
                        Output Handle = 0x7f8844008a00 [ODBC][31713][1570202266.780493][SQLSetConnectAttr.c][399]
                Entry:
                        Connection = 0x7f8844008a00
                        Attribute = SQL_ATTR_AUTOCOMMIT
                        Value = 0x1
                        StrLen = -6 [ODBC][31713][1570202266.780562][SQLSetConnectAttr.c][691]
                Exit:[SQL_SUCCESS] [ODBC][31713][1570202266.780625][SQLSetConnectAttr.c][399]
                Entry:
                        Connection = 0x7f8844008a00
                        Attribute = SQL_ATTR_ODBC_CURSORS
                        Value = 0x0
                        StrLen = -6 [ODBC][31713][1570202266.780684][SQLSetConnectAttr.c][691]
                Exit:[SQL_SUCCESS] [ODBC][31713][1570202266.780752][SQLConnect.c][3721]
                Entry:
                        Connection = 0x7f8844008a00
                        Server Name = [MyODBCOrigin][length = 7 (SQL_NTS)]
                        User Name = [NULL]
                        Authentication = [NULL]
                UNICODE Using encoding ASCII 'US-ASCII' and UNICODE 'UCS-2-INTERNAL'

用于测试的配置:

我的odbc.ini
[MyODBCOrigin]
Description = Example
Driver = MDBTools
Servername = localhost
Database = /database.accdb
UserName =
Password =
port = 5432
我的odbcinst.ini
[ODBC]
Trace = 1
TraceFile = /tmp/odbctrace.log

[MDBTools]
Driver = /usr/local/lib/libmdbodbc.dylib
Setup  =

任何人都可以帮我解决这个问题吗?

编辑

在 mdbtools 存储库上找到了这个“错误报告”。这似乎是同样的问题。我已经尝试了上次评论中建议的解决方案,但它不起作用。

编辑2

SQL_CUR_USE_ODBC用作odbc_connect()返回nginx404错误的参数(odbc 进程死亡,与 pdo 相同的错误)。使用SQL_CUR_USE_DRIVER, 返回指定的错误(这篇文章中的致命错误详细信息)。

4

0 回答 0