LinuxのPHPからWindowsのSQLServerへ接続する方法

2018.4.10

公式サイトに書かれている内容

下記のページに、UbuntuのPHPを使ってSQLServerへ接続する方法が記載されています。 この内容に従って、接続できるところまで行ってみたいと思います。 私が試した環境では、SQLServerはWinodwsServer上で動作しています。

https://www.microsoft.com/en-us/sql-server/developer-get-started/php/ubuntu/

公式サイトには、SQLServerをLinuxにインストールすることが書かれていますが、別サーバでSQLServerを稼働させていますので、省きます。

必要なモジュールのインストール

使用しているOSは、Ubuntu16.04LTSです。

PHPからSQLServerに接続するために必要なモジュールをインストールします。 すでに、インストール済みのモジュールがあれば省いてください。 今回は、コマンドラインでの接続とApache経由での接続を試してみたいと思います。

sudo apt-get -y install php7.0 libapache2-mod-php7.0 mcrypt php7.0-mcrypt php-mbstring php-pear php7.0-dev apache2

SQLCMDの有効化

まずは、PHPを使わずに、コマンドラインでSQLServerへ接続できるようにします。 公式に書かれている、下記のコマンドを順番に実行していけば、特に躓くこともなく進められると思います。

curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-tools.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install mssql-tools
sudo apt-get install unixodbc-dev
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

sudo apt-get updateでapt-transport-httpsを求められるエラーが発生する場合は、下記のコマンドを実行して、インストールしてください。

sudo apt install apt-transport-https

終わったら、下記のコマンドの、「sa」と「yourpassword」を環境に合わせて変更して実行してください。

sqlcmd -S localhost -U sa -P yourpassword -Q "SELECT @@VERSION"

実行して、下記のようなメッセージが表示されれば接続は成功です。

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
        Jun 28 2012 08:36:30
        Copyright (c) Microsoft Corporation
        Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

(1 rows affected)

phpを使って接続する

今度は、PHPを使ってSQLServerに接続してみたいと思います。 peclを使ってモジュールをインストールすため、pearが入っていなければ入れておきます。 もし、インストールしてい無い場合は、インストールしてください。

sudo apt-get install php-pear

入れていないとこうなります。

sudo: pecl: コマンドが見つかりません

phpizeが必要になるので、php7.0-devもインストールしておきます。 同じくインストールしていない場合はインストールしてください。

sudo apt install php7.0-dev

入れていないとこうなります。

downloading sqlsrv-5.2.0.tgz ...
Starting to download sqlsrv-5.2.0.tgz (171,728 bytes)
.....................................done: 171,728 bytes
downloading pdo_sqlsrv-5.2.0.tgz ...
Starting to download pdo_sqlsrv-5.2.0.tgz (164,456 bytes)
...done: 164,456 bytes
33 source files, building
running: phpize
sh: 1: phpize: not found
ERROR: `phpize' failed
34 source files, building
running: phpize
sh: 1: phpize: not found
ERROR: `phpize' failed

公式に書かれているコマンドを実行します。

sudo pecl install sqlsrv pdo_sqlsrv

公式では下記の2行が書かれていますが、phpenmodコマンドでON、OFFしたいので、phpのmods-availableディレクトリに、sqlsrvモジュール用のiniファイルを作って、phpenmodで有効化する方法で行います。

これは実行しません。
sudo echo "extension=pdo_sqlsrv.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
sudo echo "extension=sqlsrv.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`

まずは、sqlsrv.iniの作成です。

sudo vi  /etc/php/7.0/mods-available/sqlsrv.ini

内容は、下記のように書きます。

extension=pdo_sqlsrv.so
extension=sqlsrv.so

保存して、下記のコマンドを実行します。こうしておくと、Apache経由でも、CLI経由でも有効になりますので、管理が非常に楽になります。

sudo phpenmod sqlsrv

無効にする場合は、phpdismodをphpenmodの代わりに実行することで無効化することができます。 このコマンドによって実現されることは、下記、2つのディレクトリにiniファイルへのシンボリックリンク作成です。

編集が終わったらapacheを再起動します。

sudo service apache2 restart

ここまで来たら、PHPファイルを作成して、公式にあるようなコードを書いて、ブラウザからURLにアクセスすると、SQLServerに接続できます。 $localhost、“Database”、“Uid”、“PWD"の値は、環境に合わせて変更してください。

connect.php
<?php
    $serverName = "localhost";
    $connectionOptions = array(
        "Database" => "SampleDB",
        "Uid" => "sa",
        "PWD" => "your_password"
    );
    //Establishes the connection
    $conn = sqlsrv_connect($serverName, $connectionOptions);
    if($conn)
        echo "Connected!"

成功したら、「Connected!」の文字が表示されます。

エクステンションが無効な場合は、下記のようなエラーが発生します。 また、Apache経由の場合はブラウザに500エラーが返ってきます。

PHP Fatal error:  Uncaught Error: Call to undefined function sqlsrv_connect()