Ошибка инструкции обновления PHP unixODBC

#php #ms-access #ubuntu #unixodbc

#php #ms-access #ubuntu #unixodbc

Вопрос:

Я использую Ubuntu php unixodbc mdbtools для работы с mdb-файлом.
Все (подключение выбор) работает хорошо, но инструкции Insert или Update .
Мой код выглядит примерно так :

 $mdbConnection = new PDO("odbc:mdbdriver",$user , $password , array('dbname' =>$FileName) ); 
$SelectResult = $mdbConnection->query("Select * from Zone");

$UpdateResult = $mdbConnection->query("Update Zone Set ShahrCode = 99"); 
  

$SelectResult возвращает правильный результат, но второй выдает ошибку, которая приводит к ошибке apache в segfault.
Я тестирую это с помощью команды isql.Выполнение инструкции Select выполнено успешно, а Update — нет.

 #isql mdbdriver
 --------------------------------------- 
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
 --------------------------------------- 
SQL>Update Zone Set ShahrCode = 99
Error at Line : syntax error near Update
syntax error near Update
Got no result for 'Update Zone Set ShahrCode = 99' command
[08001][unixODBC]Couldn't parse SQL
[ISQL]ERROR: Could not SQLExecute
  

Или

 SQL> Update [Zone] Set ShahrCode = 99
Error at Line : syntax error near Update
syntax error near Update
Got no result for 'Update [Zone] Set ShahrCode = 99' command
[ISQL]ERROR: Could not SQLExecute
  

Как мне исправить эту ошибку?
Спасибо всем

Комментарии:

1. Когда вы запускаете «Update Zone Set ShahrCode = 99» при открытии MDB-файла в операционной системе Windows в Access, это работает или вы получаете аналогичную ошибку?

2. Нет, в ОС Windows проект работает правильно.

Ответ №1:

Лично я бы не стал тратить много времени на то, чтобы заставить PHP mdb_tools unixODBC надежно работать вместе. Я пытался несколько раз и был довольно безуспешным, несмотря на все мои усилия.

Мои рекомендации были бы:

  1. Если сохранение ваших данных в файле Access .mdb является обязательным требованием, тогда следует предположить, что в проекте задействованы компьютеры Windows. В этом случае я бы посоветовал вам запустить свой PHP-код на компьютере с Windows и использовать COM_DOTNET для управления базой данных Access (через Windows ODBC с использованием ADODB.Connection и связанных объектов).

  2. Если выполнение вашего PHP-кода в Linux является обязательным требованием, тогда есть веские основания для переноса ваших данных из Access .mdb в какую-либо другую базу данных, которая лучше работает с PHP. (MySQL был бы одним из наиболее распространенных вариантов.)

  3. Если оба 1. и 2. являются жесткими требованиями, то, возможно, лучшим вариантом может быть перемещение файла .mdb на компьютер с Windows и использование ODBTP для управления файлом .mdb из PHP-кода, запущенного на компьютере с Linux.

Комментарии:

1. Спасибо. Но есть ограничение для всех трех вариантов. Я пробовал ODBTP раньше и работает нормально, но в этом случае я не могу его использовать. конечно, мы используем mysql в нашем проекте, но нам также нужно сгенерировать mdb-файл.

Ответ №2:

Наконец я нашел решение :
mdbtools пока не может выполнять запись в mdb-файлы.

В настоящее время MDB Tools поддерживает форматы Access 97 (Jet 3) и Access 2000/2002 (Jet 4) только для чтения. В настоящее время ведется работа над поддержкой записи, и ожидается, что первое сокращение будет включено в выпуск 0.6.

Нашим решением является использование простого скомпилированного java-приложения.

  1. Создайте простой java-проект с библиотекой Jackcess.
  2. Включите параметры CLI для java-приложения и делайте то, что хотите, с mdb-файлом.
    • Вы даже можете получить путь к файлу mdb с параметрами CLI.
  3. Скомпилируйте проект java.
  4. В PHP вы можете использовать exec('cd path/to/javaproject;java -cp .
    YourJavaProject "mdbfilepath" "insert|update|or select"',$output);