подключения к MariaDB из PHP с помощью ODBC

Thank you for reading this post, don't forget to subscribe!

Исполь­зо­ва­ние ODBC в PHP поз­во­лит делать SQL-запро­сы неза­ви­си­мо от типа СУБД — это может быть MySQL/MariaDB, MS SQL, Sybase, Oracle, PostgreSQL и так далее. Мы рас­смот­рим под­клю­че­ние к MariaDB. Пред­ло­жен­ная инструк­ция про­те­сти­ро­ва­на на Linux Ubuntu и CentOS.

ODBC connector

Для нача­ла мы долж­ны уста­но­вить ODBC connector. Нам пона­до­бить­ся ска­чать на наш сер­вер архив, поэто­му сна­ча­ла инстал­ли­ру­ем wget.

а) на CentOS / Red Hat:

yum install wget

После уста­нов­ки wget перей­дем в ката­лог /tmp:

cd /tmp

Откры­ва­ем бра­у­зер и захо­дим на стра­ни­цу загруз­ки кон­нек­то­ров MariaDB и выби­ра­ем ODBC connector, а так­же нашу опе­ра­ци­он­ную систе­му, например:

* в дан­ном слу­чае мы загру­зим кон­нек­тор для CentOS 8.

Ниже на этой же стра­ни­цы мы уви­дим ссыл­ку на ска­чи­ва­ние нуж­но­го нам кон­нек­то­ра. Копи­ру­ем дан­ную ссылку:

С помо­щью wget и ско­пи­ро­ван­ной ссыл­ки загру­жа­ем на сер­вер коннектор:

wget https://dlm.mariadb.com/1269825/Connectors/odbc/connector-odbc-3.1.10/mariadb-connector-odbc-3.1.10-centos8-amd64.tar.gz

Рас­па­ко­вы­ва­ем его:

tar zxvf mariadb-connector-odbc-*.tar.gz

И копи­ру­ем биб­лио­те­ки в ката­лог /usr/lib64:

cp mariadb-connector-odbc-*-amd64/lib64/mariadb/lib* /usr/lib64/

После ска­чан­ный архив и рас­па­ко­ван­ный ката­лог мож­но удалить:

rm -rf mariadb-connector-odbc-*

Установка и подготовка к работе СУБД

Для про­вер­ки настрой­ки нам нужен сер­вер баз дан­ных. Если его нет, то уста­но­вим mariadb-server на тот же сер­вер, где и раз­вер­ну­ли ODBC.

а) для CentOS / Red Hat:

yum install mariadb-server

После уста­нов­ки запус­ка­ем сер­вис и настра­и­ва­ем его на автозапуск:

systemctl enable mariadb --now

Зада­ем пароль для суперпользователя:

mysqladmin -u root password

Захо­дим в кон­соль SQL:

mysql -uroot -p

Созда­ем новую базу данных:

CREATE DATABASE my_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* для наших тестов мы созда­ли базу с назва­ни­ем my_db.

Дадим пра­ва на под­клю­че­ние и рабо­ту с создан­ной базой данных:

GRANT ALL PRIVILEGES ON my_db.* TO 'odbc_user'@'localhost' IDENTIFIED BY 'odbc_password';

* дан­ной коман­дой мы раз­ре­ши­ли доступ к базе my_db поль­зо­ва­те­лю odbc_user, кото­рый будет под­клю­чать­ся с локаль­но­го ком­пью­те­ра и паро­лем odbc_password.

Под­клю­ча­ем­ся к создан­ной базе данных:

> use my_db;

Созда­ем про­стень­кую таблицу:

[codesyntax lang="php"]

[/codesyntax]

* наша создан­ная таб­ли­ца будет состо­ять из 3 столб­цов — idname и rights.

Доба­вим 3 стро­ки в нашу таблицу:

INSERT INTO users (`name`, `rights`) VALUES ('Дмит­рий', 'admin'), ('Оля', 'superuser'), ('Антон' ,'operator');

Гото­во. Теперь выхо­дим из sql-оболочки:

> quit

Установка и настройка ODBC

Уста­нав­ли­ва­ем сам ODBC.

а) для CentOS / Red Hat:

yum install unixODBC

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл:

vi /etc/odbcinst.ini

Про­ве­ря­ем нали­чие сле­ду­ю­щей запи­си (если ее нет, добавляем):

[codesyntax lang="php"]

[/codesyntax]

* в дан­ном при­ме­ре опи­са­но под­клю­че­ние к СУБД с драй­ве­ром MariaDB и путем до фай­ла с биб­лио­те­кой (отдель­но для 32- и 64-раз­ряд­ной версии).

Откры­ва­ем файл:

vi /etc/odbc.ini

Добав­ля­ем DSN для под­клю­че­ния к наше­му сер­ве­ру и базе, кото­рую созда­ва­ли на преды­ду­щем этапе:

[codesyntax lang="php"]

[/codesyntax]

* где:

  • ODBC про­из­воль­ное назва­ние для наше­го подключения.
  • Driver — драй­вер, кото­рый мы будем исполь­зо­вать. Его мы опи­са­ли в фай­ле /etc/odbcinst.ini.
  • USER поль­зо­ва­тель, под кото­рым будем под­клю­чать­ся к базе. Исполь­зу­ем дан­ные для ранее создан­ной учет­ной запи­си в mariadb.
  • PASSWORD пароль для создан­но­го ранее поль­зо­ва­те­ля, под кото­рым мы будем под­клю­чать­ся к базе.
  • Server — сер­вер баз дан­ных. В нашем при­ме­ре локаль­ный сервер.
  • Database — имя создан­ной базы данных.
  • Port — порт, на кото­ром слу­ша­ет сер­вер. 3306 исполь­зу­ет­ся по умол­ча­нию для MariaDB.

Про­бу­ем под­клю­чить­ся к базе с исполь­зо­ва­ни­ем ODBC:

isql -v ODBC

* где ODBC — назва­ние для под­клю­че­ния, кото­рое мы зада­ли на преды­ду­щем шаге.

Мы долж­ны уви­деть команд­ную стро­ку для вво­да команд sql — про­бу­ем полу­чить дан­ные из нашей таб­ли­цы users:

> select * from users;

Мы долж­ны уви­деть что-то на подобие:

[codesyntax lang="php"]

[/codesyntax]

Мож­но выхо­дить из sql-оболочки:

> quit

Настройка php

Теперь настро­им под­клю­че­ние из php. Мы рас­смот­рим 2 спо­со­ба под­клю­че­ния — с помо­щью odbc_connect и PDO.

Пред­ва­ри­тель­но, созда­дим ката­лог, в кото­рый раз­ме­стим тесто­вый скрипт для под­клю­че­ния к базе:

mkdir -p /var/www/php

odbc_connect

Ста­вим рас­ши­ре­ние php-odbc (а так­же сам php, если его нет на сервере).

а) для CentOS / Red Hat:

yum install php php-odbc

После уста­нов­ки созда­дим скрипт для про­вер­ки подключения:

vi /var/www/php/db.php

[codesyntax lang="php"]

[/codesyntax]

* в дан­ном листин­ге мы зада­ем пара­мет­ры для под­клю­че­ния к локаль­но­му сер­ве­ру (127.0.0.1) с учет­ны­ми дан­ны­ми, кото­рые созда­ли при настрой­ке СУБД. После мы выпол­ня­ем выбор­ку и выво­дим резуль­тат на экран.

Или же мы можем сокра­тить наш скрипт. Ранее для про­вер­ки мы созда­ли ODBC DSN в фай­ле /etc/odbc.ini. PHP с помо­щью odbc_connect может ссы­лать­ся для соеди­не­ния на него. Ито­го, получаем:

[codesyntax lang="php"]

[/codesyntax]

* обра­ти­те вни­ма­ние, что мы пере­да­ем функ­ции odbc_connect толь­ко 3 пара­мет­ра для подключения:

  1. ODBC назва­ние для наше­го DSN.
  2. odbc_user — имя поль­зо­ва­те­ля для под­клю­че­ния к базе данных.
  3. odbc_password — пароль для под­клю­че­ния к базе.

PDO

Ста­вим рас­ши­ре­ние php-pdo (а так­же сам php, если его нет на сервере).

а) для CentOS / Red Hat:

yum install php php-pdo

После уста­нов­ки созда­дим скрипт для про­вер­ки подключения:

vi /var/www/php/db.php

[codesyntax lang="php"]

[/codesyntax]

* в дан­ном листин­ге мы зада­ем пара­мет­ры для под­клю­че­ния к локаль­но­му сер­ве­ру (127.0.0.1) с учет­ны­ми дан­ны­ми, кото­рые созда­ли при настрой­ке СУБД. После мы выпол­ня­ем выбор­ку и выво­дим резуль­тат на экран.

Или же мы можем сокра­тить наш скрипт. Ранее для про­вер­ки мы созда­ли ODBC DSN в фай­ле /etc/odbc.ini. PHP с помо­щью PDO может ссы­лать­ся для соеди­не­ния на него. Ито­го, получаем:

[codesyntax lang="php"]

[/codesyntax]

* обра­ти­те вни­ма­ние, что мы пере­да­ем функ­ции PDO толь­ко 3 пара­мет­ра для подключения:

  1. odbc:ODBC спо­соб соеди­не­ния с базой и назва­ние для наше­го DSN.
  2. odbc_user — имя поль­зо­ва­те­ля для под­клю­че­ния к базе данных.
  3. odbc_password — пароль для под­клю­че­ния к базе.

Проверка запроса

После того, как мы созда­ли скрипт про­вер­ки любым из выше­опи­сан­ных спо­со­бов, запус­ка­ем его на исполнение:

php /var/www/php/db.php

Мы долж­ны полу­чить сле­ду­ю­щий результат:

[codesyntax lang="php"]

[/codesyntax]

Под­клю­че­ние к MariaDB с помо­щью ODBC настроено.

Возможные ошибки

Call to undefined function odbc_connect()

Воз­ни­ка­ет при попыт­ке запу­стить скрипт, кото­рый под­клю­ча­ет­ся к базе с помо­щью функ­ции odbc_connect.

При­чи­на: для нашей вер­сии php не уста­нов­ле­но рас­ши­ре­ние php-odbc.

Реше­ние: коман­да для уста­нов­ки зави­сит от исполь­зу­е­мо­го типа дис­три­бу­ти­ва Linux.

а) для CentOS / Red Hat:

yum install php-odbc