Help us understand the problem. What is going on with this article?

Ubuntu 20.04 の PHP 7.4 から MS SQLServer に接続する

環境

  • Ubuntu 20.04.1 LTS (Focal Fossa)
  • PHP 7.4.10

Microsoft のドキュメント

インストールの流れ

先にODBCドライバをインストールした後、PHP側のpeclでドライバをインストールする。
ODBCドライバがない状態では、peclでのインストール時にビルドに失敗する。

ODBCドライバのインストール

マニュアルから

sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql17
# optional: for bcp and sqlcmd
sudo ACCEPT_EULA=Y apt-get install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo apt-get install unixodbc-dev

問題発生

マニュアルではoptionalになっているが、PHPのドライバをビルドするにはunixodbc-devが必要。
しかし、素直にインストールしようとすると失敗する。

エラー
以下のパッケージには満たせない依存関係があります:
 unixodbc-dev : 依存: unixodbc (= 2.3.7)
                依存: odbcinst1debian2 (= 2.3.7) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

apt listしてみると

$ apt list unixodbc*
一覧表示... 完了
unixodbc-dev/bionic,focal 2.3.7 amd64
unixodbc-dev/focal 2.3.6-0.1build1 i386
unixodbc/bionic,focal 2.3.7 amd64
unixodbc/focal 2.3.6-0.1build1 i386
$ apt list odbcinst1debian2
一覧表示... 完了
odbcinst1debian2/bionic 2.3.7 amd64
odbcinst1debian2/focal 2.3.6-0.1build1 i386

amd64版はfocal向けのバージョンが合っていない。

解決策

同じバージョンで指定して、同時にインストールする。

sudo apt install unixodbc-dev=2.3.6-0.1build1 libodbc1=2.3.6-0.1build1 odbcinst1debian2=2.3.6-0.1build1

失敗する方法

  • i386版ならバージョンが合っているのでunixodbc-dev:i386をインストール ⇒ 後に続くpecl install sqlsrvに失敗する。
  • unixodbc-dev=2.3.6-0.1build1をインストール ⇒ 依存関係をインストールしてくれない。

PHP用のドライバインストール

上記の方法でunixodbc-devのインストールに成功していれば、マニュアル通りに問題なくインストールできる。

sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv
sudo su
printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/7.4/mods-available/sqlsrv.ini
printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/7.4/mods-available/pdo_sqlsrv.ini
exit
sudo phpenmod -v 7.4 sqlsrv pdo_sqlsrv```
awachang
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away