はじめに
前回からシリーズでお送りしている「PHPからMicrosoft SQL Serverを使おう!」、第2回目は、PHPコードからのMicrosoft SQL Server(以下 SQL Server)への接続についてです。
今回の記事では、マイクロソフトがPHP向けにリリースした、SQL Server Driver for PHPドライバーの入手とインストール、実際にPHPのコードからSQL Serverに接続するための方法について紹介させていただきます。
1 PHPコードからSQL Serverへの接続
1.1 PHPコードからSQL Serverへ接続するための手段
PHP 5.2までのPHPランタイムには、SQL Serverに接続するためのMssql関数(php_mssql.dll)が用意されており、アプリケーションはこれを使用してSQL Serverに接続することができましたが、Windows版のPHP 5.3以降のバージョンではサポートされない状態となっていました。
また、マイクロソフトからは、PHP 5.3以降のPHPでも使用可能なSQL Server 2005用のドライバーがリリースされましたが、UTF-8に絡む文字化けなどで、なかなか気軽に使用できるという状況ではありませんでした。
しかし、その後リリースされたSQL Server Driver for PHP Version 1.1では、これらの問題に対応し、さらには最新のVersion 2.0ではPDOがサポートされました。これにより他のデータベースサーバーとの相互運用性が格段に向上しています。
1.2 SQL Server Driver for PHPを使用するには
SQL Server Driver for PHPを使用するには、(1)ドライバーのファイルを入手し、(2)PHPランタイムのエクステンションに配置して、(3)php.iniファイルに設定を追加する、という一連の作業を行います。
これらの作業は、一般的なPHP拡張を追加する手順と同じです。
SQL Server Driver for PHPからインストールまでの具体的な手順は以下の通りです。
- ダウンロードセンターよりMicrosoft Drivers for PHP for SQL Serverをダウンロードします。
- ダウンロードしたファイル「SQLSRV20.EXE」をダブルクリックし、任意のフォルダに内容を解凍します。
- 解凍されたファイルから、使用しているPHPランタイムのバージョンと種類にあった*.dllを、PHPランタイムのextフォルダに配置します。
なお、解凍されたファイルには、PHP 5.2と5.3用の、スレッドセーフ、ノン・スレッドセーフ用の2つのsqlsrvドライバーと、PDOのドライバーのファイルが含まれています。ドライバーファイルがスレッドセーフなものであるか否かの判断は、ファイル名に含まれる文字、ts(Thread Safe)かnts(Non Thread Safe)かで行います。
PHPのバージョンとファイルの対応についての詳細は、MSDNのドキュメント「System Requirements(Microsoft Drivers for PHP for SQL Server)」内の表をご参照ください。
- php.iniファイルにドライバーの参照情報を追加します。
PHPランタイム内にあるphp.iniファイルをテキストエディターでオープンし、様々なエクステンション(拡張)への参照が"extension="で記述してある箇所に以下のように記述を追加します。
extension=php_sqlsrv_53_nts_vc9.dll extension=php_pdo_sqlsrv_53_nts_vc9.dll
なお、php.iniファイルが存在しない場合は、php.ini-recommendedファイルをphp.iniにリネームして使用します。
以上でphp.iniファイルへの設定の追加は完了です。
PHPスクリプトファイルにphpinfo関数を記述して実行し、ドライバーが正しく組み込まれたか確認します。
正しく組み込まれていれば、phpinfo関数の結果に、以下のような設定が表示されます。
1.3 PHPからSQL Serverに接続するコード
PHPからSQL Server Driver for PHPを使用してSQL Serverに接続するサンプルコードを紹介します。
このコードが接続するデータベースの情報は以下のとおりです。
- インスタンス名 : .\SQLEXPRESS
- データベース名 : MyDB
- テーブル名 : staffs
<html> <head> <title></title> </head> <body> <?php //データベースのインスタンス名を指定 $serverName = ".\\SQLEXPRESS"; //接続情報を指定 $connectionInfo = array("UID"=>"sa", "PWD"=>"password", "Database"=>"MyDB", "CharacterSet"=>"UTF-8"); //コネクションを確立 $conn = sqlsrv_connect($serverName, $connectionInfo); //クエリー文を指定 $tsql = "SELECT * from staffs"; //クエリーを実行 $result = sqlsrv_query($conn, $tsql); ?> <table> <caption>スタッフリスト</caption> <?php //実行結果を描画 while($row = sqlsrv_fetch_array($result)) { printf("<tr><td class='hdr'>".$row['id']."</td>"); printf("<td>".$row['name']."</td></tr>"); } ?> </table> <?php //クエリー結果の開放 sqlsrv_free_stmt($result); //コネクションのクローズ sqlsrv_close($conn); ?> </body> </html>
実行結果は以下の通りです。日本語を出力しても文字化けが発生していないことを確認してください。
1.4 便利なPDOによる接続
前述しましたが、SQL Server Driver for PHP Version 2.0ではPDO(PHP Data Object)をサポートしています。
PDOはPHPに実装されているデータベース抽象化レイヤークラスであり、これを使用すると同じ関数を使用して複数種類にデータベースに接続することができます。
たとえば、PDOを使用しないでPHPコードからデータベースに接続する場合、MySQLに接続する際はmysql_connect関数を、SQL Serverに接続する際にはsqlsrv_connect関数を、とそれぞれ異なる関数を使い分ける必要がありますが、PDOの場合は共通の関数を使用することができます。
<html> <head><title>PHP TEST</title> <style type="text/css"> table{ border-color:skyblue; border-style:solid; boder-widht:1px; width:300px; } .hdr{background-color:gainsboro} </style> </head> <body> <table> <caption>スタッフリスト</caption> <?php $dsn = 'sqlsrv:server=.\sqlexpress;database=MyDB'; $user = 'sa'; $password = 'P@ssword'; $dbh = new PDO($dsn, $user, $password); $sql = "select * from staffs"; foreach ($dbh->query($sql) as $row) { print("<tr><td class='hdr'>".$row['id']."</td>"); print("<td>".$row["name"]."</td></tr>"); } $dbh = null; ?> </table> </body> </html>
たとえば、上記のサンプルコードは、PHPからSQL Serverに接続するコードですが、接続文字列とアカウント情報を以下のように書き換えることによりMySQLにも同じコードで接続することができます。
$dsn = 'mysql:host=localhost;dbname=MyDB'; $user = 'root'; $password = 'P@ssword
データベースインスタンス名と、データベース名を指定する文字列がsqlsrvとmysqlでは微妙に異なることに注意してください。
PDOを使用することにより、PHPアプリケーションは、複数のデータベースのサポートが容易になります。
また、最近のPHPのOSS WebアプリケーションでもPDOを使用しているものが結構あるようなので、たとえばWebアプリケーションがMySQLに対して作成しているデータベーススキーマをSQL Serverにまったく同じく作成して、そちらを使用させるということもできそうです。
2 無償のMicrosoft SQL Serverについて
2.1 Microsoft SQL Serverとは
マイクロソフトは有償製品としてSQL Serverというデータベースサーバーをリリースしています。SQL Serverは、強力な高可用性とBI(Business Intelligence)機能を備えており、金融、証券をはじめとしたの世界中の多くのミッションクリティカルな現場で採用されています。またパフォーマンスにおいても、第三者調査機関が実施するベンチマークテストにて常に上位をキープし続ける実績と実力をもっています。
SQL Server Expressとは?
SQL Serverには複数のエディションがあります。そのもっとも標準的なエディションから、データベースサーバーとして、開発と運用に必要な基本的な機能のみを抽出したものが無償のSQL Server Expressになります。
SQL Server Expressは、学習や、デスクトップおよび小規模サーバーアプリケーションの構築、ISVによる再配布などに使用することができます。
2.2 SQL Server Expressの種類
現在の最新のSQL Server 2008 R2 Expressでは、目的にあわせ複数種類のインストールパッケージが用意されています。
各インストールパッケージの内訳は以下のとおりです。
インストール イメージ | 説明 |
Microsoft SQL Server 2008 Express | DBエンジンのみ |
Microsoft SQL Server 2008 Express with Tools | DBエンジンとグラフィカルな管理ツール |
Microsoft SQL Server 2008 Express with Advanced Services | DBエンジンとグラフィカルな管理ツール、レポート、フルテキスト検索機能 |
Microsoft SQL Server 2008 Express Edition Service Pack 1 | DBエンジンのみ(SQL Server 2008 SP1 適用済) |
また、SQL Server 2008 R2 Expressに関連するその他のインストールパッケージには以下のものがあります。
インストールイメージ | 説明 |
Microsoft SQL Server 2008 Management Studio Express | グラフィカルな管理ツールのみ |
SQL Server 2008 Service Pack 1 | SQL Server 2008のサービスパック |
各インストールパッケージは以下のリンクから入手することができます。
SQL Server 2008 Express
- Microsoft SQL Server 2008 R2 Express
- Microsoft SQL Server 2008 R2 Express with Management Tools
- Microsoft SQL Server 2008 R2 Express with Advanced Services
関連ツール
まとめ
PHPコードからのSQL Serverへの接続については、サポートされていた関数が無くなってしまったり、代替えのドライバーがあっても若干の問題があったりと、なかなか気軽に利用できるという状況ではありませんでした。
しかし、現在マイクロソフトから提供されているSQL Server Driver for PHP Version 2.0では、それらの問題に対応していることはもちろん、PDOもサポートしているため、データベースに対するアプリケーションコードの相互運用性を高めることができるようになっています。
SQL Serverについても無償のSQL Expressが公開されているため、IIS上にSQL Serverを使用するPHPの開発環境を、コストをかけずに構築することができます。
開発環境の構築についても、さまざまなIIS拡張の提供、Web Platform Installerの登場により、今までよりも簡単に行えるようになっています。
この機会にぜひお試しください。