Я пытаюсь работать с ODBC на компе Mac OS X 10.14.
В моем devel env есть веб-сервер nginx и php 7.3.10. После некоторых руководств я установил mdbtools
с поддержкой odbc.
Я могу читать свою базу данных доступа с помощью isql
, через имя odbc или DSN.
Command: isql -v -k "Driver=MDBTools;DBQ=/database.accdb;"
Command: isql -v MyODBOrigin
Используя обаКоманды соединения, isql
соединяет ОК, и я могу использовать SELECT * 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 . Кажется, это та же проблема. Я пробовал решение, предложенное в последнем комментарии, но оно не работает.
EDIT2
Использование SQL_CUR_USE_ODBC
в качестве параметра для odbc_connect()
возвращает ошибку 404
nginx (процесс odbc умирает,та же ошибка, что и с pdo). Использование SQL_CUR_USE_DRIVER
возвращает указанную ошибку (подробности фатальной ошибки в этом сообщении).