2015-12-11 14 views
0

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

код 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"; 

Здесь: TransactionID является AutoNumber в доступе; 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 Functions, чтобы сделать работу.

Пример:

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

$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 в вашем U buntu Server, который можно найти в папке/etc. Введите формат DSN ниже в файле odbc.ini.

Серия DSN производится в следующем формате:

[MyDataSource]

Описание = Источник My Data

Driver = MyDriver

ServerName = локальный

База данных = MyDatabase/Полный путь вашего БД FIle

Что в моем образце кода:

[YourDSN]

Описание = Это настроенное DSN для доступа к бд

Driver = MDBTools

ServerName = локальный

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

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

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

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

OLD ОТВЕТ:

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

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

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

Вместо использования подготовки и выполнить функцию 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); 

И потом:

В файле DB MSACCESS (MDB, .accdb), просто измените Размер поля of Текст Тип данных для или нет.

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

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

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

+0

Спасибо за подробный ответ. Но я не могу контролировать исходную базу данных доступа, чтобы ограничить длину текстовых столбцов, поскольку она предоставляется поставщиком оборудования, поэтому я продолжаю использовать решение на базе Windows! – kpk

0

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

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

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