LinuxのPHPからWindowsのSQLServerへ接続する方法
公式サイトに書かれている内容
下記のページに、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 ファイルへのシンボリックリンク作成です。
- /etc/php/7.0/cli/conf.d
- /etc/php/7.0/apache2/conf.d
編集が終わったら 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()