Драйвер MDBTools не возвращает строковые значения с PHP MS-Access

У нас есть база данных посещаемости MS Access, которая обновляется биометрическим оборудованием. Так что нет возможности заменить MS Access. Теперь нам нужно предоставить информацию о посещаемости в нашей интрасети, для которой мы пытаемся периодически читать файл mdb MS-Access на компьютере под управлением Windows XP и записывать в базу данных postgres через php. PHP — Postgres — Apache работает на сервере Ubuntu 10.04. HTML-страницы / отчеты должны отображаться с сервера.
При использовании инструментов MDB для подключения к файлу MDB MS-Access из php, возвращаются только поля Number и Date / Time (хотя и в виде String). Текстовые поля возвращают NULL.

Код PHP выглядит следующим образом:

$dbName = "/media/winshare/attEngine.mdb";
if (!file_exists($dbName))
die("Could not find database file.");
$dbconn = new PDO("odbc:DRIVER=MDBTools; DBQ=$dbName; Uid=admin; Pwd=pswd;");
if ($dbconn) {
echo "mdb connection established.<br />\n";
} else {
die ("mdb connection could not be established.<br />\n");
}
$qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions;";
$dbqryprep = $dbconn->prepare($qry);
$dbqryprep->execute();
$result = $dbqryprep->fetchall(PDO::FETCH_ASSOC);

echo "QRY RESULT (from Access):<pre>\n";
var_dump($result);
echo "\n</pre>\n";

Здесь :actionId — это AutoNumber в Access;
aDate, aDateTime — дата / время;
EmpCode — это номер; а также
EmpName и ControllerNum являются текстовыми полями в Access.

Когда мы загружаем php, он дает результат следующим образом (показаны только первые два элемента массива):

mdb connection established.

QRY RESULT (from Access):

array(31986) {
[0]=>   array(7) {
["transactionId"]=>     string(3) "341"["aDate"]=>     string(17) "11/23/13 00:00:00"["aDateTime"]=>     string(17) "11/23/13 13:01:07"["EmpCode"]=>       string(1) "0"["EmpName"]=>       NULL
["ControllerNum"]=>     NULL
}
[1]=>   array(7) {
["transactionId"]=>     string(3) "342"["aDate"]=>     string(17) "11/23/13 00:00:00"["aDateTime"]=>     string(17) "11/23/13 13:01:12"["EmpCode"]=>       string(1) "0"["EmpName"]=>       NULL
["ControllerNum"]=>     NULL
}

На самом деле у меня есть 2 вопроса:

  1. В чем может быть проблема при использовании MDBTools, как указано выше?

  2. Или лучше запускать / планировать сценарии на компьютере Windows для подключения через odbc к Access и postgres, а также для передачи данных? Если да, то какие сценарии лучше для этого?

0

Решение

Это изменение к моему первоначальному ответу:

После дней жестких борьбы, я, наконец, понял, работающее решение для предмета вашей нити (Драйвер MDBTools не возвращает строковые значения с PHP MS-Access)

В дополнение к моему старому ответу, который очень ограничен размером поля 127 для типа данных Text, вот моя новая попытка найти решение.

Решение:

Вместо использования PDO Class при манипулировании доступом к БД я рекомендую использовать Функции ODBC сделать работу.

Пример:

В вашем блоке кода

$qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions";
$dbqryprep = $dbconn->prepare($qry);
$dbqryprep->execute();
$result = $dbqryprep->fetchall(PDO::FETCH_ASSOC);

Измените это на

$connection = odbc_connect("YourDSN","admin","pswd");
$sql = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions";
$result = odbc_exec($connection,$sql);
while($row = odbc_fetch_array($result))
{   echo "<pre>";
print_r($row);
echo "</pre>";
}

Куда «YourDSN«это DSN (имя источника данных), который должен быть создан в odbc.ini файл на вашем сервере Ubuntu, который можно найти в папке / etc. Введите приведенный ниже формат DSN в файле odbc.ini.

DSN выполнен в этом формате:

[MyDataSource]

Описание = Источник моих данных

Driver = MyDriver

ServerName = localhost

База данных = Моя база данных / Полный путь к вашему файлу БД

Который в моем примере кода:

[YourDSN]

Описание = Это настроенный DSN для вашей базы данных доступа

Driver = MDBTools

ServerName = localhost

База данных = / var / www / {your dns} / {public_html} /…/…/ media / winshare / attEngine.mdb

^ Примечание (1) База данных должен быть полным каталогом, начиная с корня (например, / var / www / …)

^ Примечание (2) Водитель должен быть MDBTools

Это оно! Просто выясните конфигурацию DSN, и все готово.
Теперь вы можете, наконец, получить типы данных Text в доступе с его максимальным размером поля. Я надеюсь, что это помогает всем. Не стесняйтесь отвечать или комментировать, если у вас есть некоторые разъяснения.

СТАРЫЙ ОТВЕТ:

Это ответ только на ваш 1-й вопрос и предмет этого
нить: Я думаю, что нет ничего плохого в том, как вы используете
MDBTools в вашем коде.

После нескольких часов поиска в сети. Наконец-то я нашел эту тему
точно так же, как проблема, с которой я столкнулся (драйвер MDBTools
не возвращает строковые значения с MSACCESS, используя PHP, работающий в Linux
Операционные системы). Может быть, это существует только при доступе к MS ACCESS в PHP, который
работать в ОС Linux? Я не знаю.

К счастью для нас, кто сталкивается с этой самой проблемой, я, кажется, нашел работу
вокруг для этого.

Вместо использования подготовить а также выполнять функция PDO, попробуйте
использовать запрос один.

ПРИМЕР

Измените эти строки кода:

$qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions;";
$dbqryprep = $dbconn->prepare($qry);
$dbqryprep->execute();
$result = $dbqryprep->fetchall(PDO::FETCH_ASSOC);

к этому:

$qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions;";
$result = $dbconn->query($qry)->fetchAll(PDO::FETCH_ASSOC);

А потом:

В вашем файле MSACCESS DB (.mdb, .accdb) просто измените Размер поля
из Текст Тип данных для 127 или же Меньше.

Помните, что этот обходной путь работает только в том случае, если значения в ваших столбцах Text имеют макс. только персонажи 127

Таким образом, тип данных Text должен быть ограничен 127 символами для
MDBTools для извлечения текста в PHP.

Я не рассматриваю это как решение, а скорее как обнаруженную ошибку. я
надеюсь, кто-нибудь заметит это. Это очень нам поможет. Особенно те, кто
столкнется с этим в будущем.

0

Другие решения

Мое решение было следующим: перевернуть все наоборот.

Т.е. вместо запуска сценариев в системе Linux я настроил персональный веб-сервер Windows в системе Windows и запустил файлы php в Windows с подключением ODBC к локальному mdb MS-Access и postgres на сервере Linux. В этом режиме все сложные запросы SQL поддерживаются для Access.

Может быть, я также могу запланировать php-скрипт в Windows (без графического интерфейса) для регулярных обновлений!

0

По вопросам рекламы [email protected]