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()