У нас есть база данных посещаемости 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 вопроса:
В чем может быть проблема при использовании MDBTools, как указано выше?
Или лучше запускать / планировать сценарии на компьютере Windows для подключения через odbc к Access и postgres, а также для передачи данных? Если да, то какие сценарии лучше для этого?
Это изменение к моему первоначальному ответу:
После дней жестких борьбы, я, наконец, понял, работающее решение для предмета вашей нити (Драйвер 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.Я не рассматриваю это как решение, а скорее как обнаруженную ошибку. я
надеюсь, кто-нибудь заметит это. Это очень нам поможет. Особенно те, кто
столкнется с этим в будущем.
Мое решение было следующим: перевернуть все наоборот.
Т.е. вместо запуска сценариев в системе Linux я настроил персональный веб-сервер Windows в системе Windows и запустил файлы php в Windows с подключением ODBC к локальному mdb MS-Access и postgres на сервере Linux. В этом режиме все сложные запросы SQL поддерживаются для Access.
Может быть, я также могу запланировать php-скрипт в Windows (без графического интерфейса) для регулярных обновлений!