Підключаємося до Access .MDB із PHP на Linux Debian
Буває так, що дані, що нам потрібні, лежать в базі даних формату Microsoft Access .MDB. Це файл, з розширенням .mdb. Він розрахований для безпроблемного доступу на платформі Windows та IIS, у нас же Linux Debian та Apache, але здаватися ми не збираємося.
УВАГА! Не вирішена проблема з кодовою сторінкою! Докладніше в кінці статті.
Спочатку необхідно перевірити середовище на предмет підтримки ODBC, далі встановити і сконфігурувати необхідні компоненти. Теоритично ми мали б змогу конектитись до будь-якого файлу (бази) .mdb, але практично функціонал працює лише через сокети (не правильна назва, правильно DSN, але тут називатимемо сокети).
Спочатку перевіряємо, чи є у нас підтримка ODBC.
php -i | grep PDO
Якщо бачимо “PDO drivers => mysql, odbc” то все чудово, наступний крок (команду) пропускаємо.
apt-get update
apt-get install php5-odbc
apt-get install libmdbodbc
Це ми встановили (оновили) libmdbodbc.
Встановлюємо MBDtools. Можна пробувати без встановлення пакету – пропустивши цей крок. Якщо не вдається – ставимо:
apt-get install mdbtools
Правимо (створюємо) файл /etc/odbcinst.ini і вписуємо туди таке:
[MDBTools]
Description = MDBTools Driver
Driver = /usr/lib/libmdbodbc.so.0
Setup = /usr/lib/libmdbodbc.so.0
FileUsage = 1
UsageCount = 1
Це ми конфігуруємо драйвер. В принципі це необхідно для конектів для довільної бази .MDB. Далі піде мова про сокети (бо довільний конект не прцює), тому можливо цей крок не обов’язковий.
Правимо (створюємо) файл /etc/odbc.ini і вписуємо туди таке:
[debian.ukr.im]
Description = Debian.Ukr.IM MS Access MDB
Driver = /usr/lib/libmdbodbc.so.0
Database = /var/www/debian.ukr.im/debian.ukr.im.mdb
Значення заміняємо логічно. Це ми створюємо такий собі сокет (DSN) з назвою debian.ukr.im для конекту до цієї бази за сокетом. Інакше не працює. Має працювати довільне під’єднання, але не працює – лише через сокети. На публічному сервері бажано базу захистити паролем, інакше всі хто знає ім’я сокета можуть отримати доступ до бази.
Тепер в PHP доступаємося до даних:
$connection = new \PDO(‘odbc:debian.ukr.im‘);
$query = ‘SELECT * FROM TableName’;
$result = $connection->query($query)->fetchAll(\PDO::FETCH_ASSOC);
print_r($result);
Все класно, але з кодовою сторінкою халепа, і схоже всім до лампочки.
$connection->exec(‘SET NAMES utf8′);
$connection->exec(‘SET CHARACTER utf8′);
нічого не дає, усілякі:
Charset = utf8
client charset = utf8
clientcharset = utf8
client_charset = utf8
Servercharset = utf8
в /etc/odbc.ini теж без дії. Варіанти з cp866 та cp1251 теж не працюють.
Рішення – перегнати .mdb -> MySQL за допомогою Bullzip MS Access to MySQL. Велике дякую розробникам за фріварну версію. З дефолтними установками utf8 в Bullzip та PhpMyAdmin дані мігрують чудово.