PHP から MS SQL Server を使用する方法


ここのところ、オープンソース関連のイベントやコミュニティのイベントに参加させていただくことがあるのですが、その際に参加者の方から “PHP アプリを SQL Server につなぎたいんだけど…” というお話しをいただくことがあります。

もちろん可能です。というか、PHP のランタイムでは以前より Mssql 関数というものが用意されており、PHP 4 までは使用可能ではあったのですが、PHP 5.3 からは Windows 上サポートされない状態となっていました。

SQL Server 2005 からはマイクロソフトからもドライバーを提供させていただいていたのですが、UTF-8 に絡む文字化けやらなにやらで、なかなか使いやすいとは言えないシロモノでした。

しかし、その後リリースされた SQL Server Driver for PHP Version 1.1 で、これらの問題に対応し、さらには最新の Version 2.0 では PDO をサポートしており、これにより他のデータベースサーバーとの相互運用性が格段に向上しています。

image
(図 : SQL Server Driver for PHP 1.1 と 2.0 の構造比較)

 

PHP から SQL Server を使用する利点

PHP の OSS Web アプリケーションをインストールしてみるとお分かりになると思いますが、そのほとんどのアプリケーションから使用されるデータベースは MySQL であり、PHP の入門書をひも解いてデータ アクセスの部分のコードを見れば、まるで宿命のごとく MySQL への接続コードが必ず記述されています。(よね、たぶん)

このように、PHP アプリケーションと MySQL データベースは ”非常に仲良し” であり、長年に渡る蜜月とも呼べる深い関係が現在もなお続いているわけですが、このような深い絆をもつ両者の関係に水を差すかのごとく、わざわざ MS SQL Server を使用する理由というのはなんでしょう?

ドライバーの提供者側からの意見としては、”PHP から SQL Server のもつビジネス インテリジェンス (BI) の機能が使用できるようになる”、”SQL Azure サービスの各種機能が使用できるようになる” というのがあります。

しかし、実際に PHP アプリケーションを開発する方々の理由というのは、「最近、イントラのアプリ開発の仕事をしているんだけど、お客様に既存システムで使用している SQL Server につなぎたいと言われることが多い」、ということだったりします。( おそらくは、 SQL Server の先には Excel のスプレッドシートやら Access なんかと連携しているのでしょう )

お客様からそのようなご要望をいただいた際に、「そんなのムリっす」 とお答えするのと 「楽勝で可能ですよ」 とお答えするのでは、案件獲得の機会に大きな差が出ることは想像に難くないでしょう。

なので、もしお知り合いで PHP 開発者の方で、まだ SQL Server Driver for PHP Version 2.0 の存在をご存じない方がいらっしゃいましたら、そっと、”PHP から MS SQL に接続する新しいドライバーが出てるよ” と、“ツイート” していただければと思います。

もちろん、直接口頭でお伝えいただいてもいっこうにかまいません。

 

SQL Server Driver for PHP を使用するには

SQL Server Driver for PHP を使用するには、ドライバーのファイルを入手して PHP ランタイムのエクステンションに配置して php.ini ファイルに設定を追加する、という一連の作業を行う必要になります。

この手順は、PHP ランタイムにエクステンションを追加する一般的な手順ですので、普段から PHP で開発を行っている方でそう大変ではないでしょう。

しかしあくまで、”そういった面倒作業は ノゥ・サンキューだぜ!”、という方には、我がチームの イチ押しアイテム Web Platform Installer こと WebPI を使用してインストールを行っていただくことができます。

WebPI を使えば、ドライバーのファイルのダウンロードから PHP ランタイムの設定まで、WebPI が “よしな” に設定してくれます。

あとは思う存分 PHP から SQL Server に接続するためのコードを記述するだけでいいのです。

とっても簡単ですネ。

 

WebPI を使用した SQL Server Driver for PHP のインストール

WebPI を使用して SQL Server Driver for PHP をインストールするには、WebPI を起動し、[ Web プラットフォーム ] タブの中のリストにある [ データベース ] の [Customize] リンクをクリックします。

image

すると、画面中に [ Microsoft Drivers for PHP for SQL Server 2.0 ] というチェックボックスが表示されるのでチェックをつけ [ Install ] ボタンをクリックします。

image

あとは、WebPI のウィザードが作業を完了するのを待つだけです。

 

手作業による SQL Server Driver for PHP のインストール

もちろん、WebPI を使用せずに SQL Server Driver for PHP をインストールすることも可能です。

便利さよりもなにがどうなっているのか把握したいという方にはこちらがおススメです。

具体的な手順は以下の通りです。

  1. ダウンロードセンターより Microsoft Drivers for PHP for SQL Server をダウンロードします。
  2. ダウンロードしたファイル SQLSRV20.EXE をダブルクリックし、任意のフォルダに内容を解凍します。
  3. 解凍されたファイルから、使用している PHP ランタイムのバージョンと種類にあった *.dll を、PHP ランタイムの ext フォルダに配置します。

    なお、解凍されたファイルには、PHP 5.2 と 5.3 用の、スレッド・セーフ用のものと、ノン・スレッドセーフ用の sqlsrv ドライバーと、PDO のドライバーのファイルが含まれています。

    image
    (図 : SQLSRV20.EXE に含まれるファイル)

    PHP のバージョンとファイルの対応についての詳細は、以下のドキュメント内の表をご参照ください。

    System Requirements (Microsoft Drivers for PHP for SQL Server)
    http://msdn.microsoft.com/en-us/library/cc296170(SQL.90).aspx

  4. php.ini ファイルにドライバーの参照情報を追加します。

    PHP ランタイム内にある php.ini ファイルをテキストエディタでオープンし、様々なエクステンション (拡張) への参照が “extension=” で 記述してある箇所に以下のように記述を追加します。

    例 ) PHP 5.3 ノン・スレッディング用のドライバーを指定する場合

    extension=php_sqlsrv_53_nts_vc6.dll
    extension=php_pdo_sqlsrv_53_nts_vc6.dll

    なお、php.ini ファイルが存在しない場合は、php.ini-recommended ファイルを php.ini にリネームして使用します。

    その場合には、念のために MySQL 用のドライバー設定も含めていかのように記述を追加してください。

    extension=php_pdo.dll
    extension=php_pdo_mysql.dll
    extension=php_sqlsrv_53_nts_vc6.dll
    extension=php_pdo_sqlsrv_53_nts_vc6.dll

以上で php.ini ファイルへの設定の追加は完了です。

phpinfo() 関数を実行し、ドライバーが正しく組み込まれたか確認します。

正しく組み込まれていれば、php.info 関数の結果に、以下のような設定が表示されます。

image
( 図 : sqlsrv ドライバーの情報 )

 

image
( 図 : sqlsrv PDO ドライバーの情報 )

 

備考 : pdo_sqlsrv が phpinfo() 関数の結果に表示されない場合

私のほうで、手動で php.ini に SQL Server Driver for PHP の参照を追加したところ、pdo_sqlsrv がロードされないという現象に遭遇しました。

試行錯誤を重ねた結果、以下のように php_pdo.dll の前に php_pdo_sqlsrv_53_nts_vc6.dll の参照を記述することで回避ができましたので、もしうまくいかない人がいましたらお試しください。ただし、これが本当に有効な回避策であるかどうかは不明です。

extension=php_pdo_sqlsrv_53_nts_vc6.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_sqlsrv_53_nts_vc6.dll

 

PHP から SQL Server に接続するコード

PHP から SQL Server Driver for PHP を使用して MS SQL Server に接続するサンプルコードを紹介します。

このコードが接続するデータベースの情報は以下のとおりです。

インスタンス名 : .\SQLEXPRESS

データベース名 : MyDB

テーブル名 : staffs

テーブルの定義 :
 image

テーブルのデータ :
staffs

 

sqlsrv_connect 関数での接続サンプル

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

 

便利な PDO  による接続

前述しましたが、SQL Server Driver for PHP Version 2.0 では PDO ( PHP Data Object ) をサポートしています。

PDO は PHP に実装されているデータベース抽象化 レイヤ クラスであり、これを使用すると同じ関数を使用して複数種類にデータベースに接続することができます。

もうちょっと具体的にいうと、PDO を使用しないで PHP コードからデータベースに接続する場合、MySQL に接続する場合は、mysql_connect 関数を、MS SQL Server に接続する場合は前述のサンプルコードにあるように sqlsrv_connect 関数を、と異なる関数を使い分ける必要がありましたが、PDO の場合は共通の関数を使用することができます。

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 から MS 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 にまったく同じく作成して、そちらを使用させるということもできそうです。

これにより、SQL Server がもっているレポート機能や分析機能、Office 連携などもできるようになるので、アプリケーションから得たデータをさら有効に利用できるようになるでしょう。

なんにしろ、こういった接続に関する垣根が取り払われることによって、様々なな可能性が広がっていくことは喜ばしいことですね。

 

おしらせ : PHP カンファレンス 2010 に登壇してまいりました

先週の土曜日 (2010/09/25) に行われました PHP カンファレンス 2010  に師匠の奥主さんと一緒に WebMatrix セッションで登壇してまいりました。

奥主さんのブログで使用したスライドが公開されていますので、ぜひご覧ください。

Hiroshi Okunushi’s Blog ☆ミ – 「【PHP】 PHP カンファレンスでの Microsoft 講演資料をアップしておきました」
http://blogs.technet.com/b/hirookun/archive/2010/09/25/3357761.aspx

 

 

Real Time Analytics

Clicky

Comments (1)

  1. PHP を Windows (IIS) で動作させるためのドキュメントを作成しました。

    今現在、IIS 上で PHP を動かすということにおいて、これ以上のものはないと自負しております。

    とくに 2 章、3 章は必見です。

    もうすでに、IIS で PHP をホストされている方も一度ご覧ください。

    PHP on Windows ガイドライン (ドラフト)

    technet.microsoft.com/…/gg535422

Skip to main content