PHPからSQL Serverに接続してみる

以下の環境で、PHPからSQL Serverに接続する手順を紹介します。

  • Windows 7 SP1(x64)
  • IIS7(*インストール済み)
  • SQL Server 2008 R2 SP1(*インストール済み)
  • PHP 5.4 (5.4.3)(*インストール済み 手順はこちら

ドライバーの取得

ダウンロードサイトからドライバーをダウンロードします。SQLSRV30.EXEをダウンロードします。SQLSRV30.EXEだとSQL Server 2012 に対応しています。
f:id:chorusde:20120622023231p:image:w500

使用許諾に同意します。
f:id:chorusde:20120622023230p:image:w400

解凍先を指定します。
f:id:chorusde:20120622023229p:image:w400

使ってくれてありがとう、詳しくはchmヘルプ読んでね的メッセージが表示されるのでOKを押して閉じます。
f:id:chorusde:20120622023228p:image:w400

解凍先にdllファイルが作成されています。
f:id:chorusde:20120622023227p:image:w400

PHPの拡張設定

PHPSQLite拡張機能を有効化します。php.iniファイル(例:"C:\php\php.ini")を開きます。まず拡張ライブラリのディレクトリが正しく設定されているか確認します(";"でコメントアウトされている場合はコメントアウトを解除します。)。

extension_dir = "[PHPインストールディレクトリ内の"ext"へのパス]"

環境にあったphp_pdo_sqlsrvとphp_sqlsrvドライバをphpのエクステンションディレクトリにコピーします。tsはスレッドセーフ(Thread Safe)、ntsは非スレッドセーフ(Non Thread Safe)です。私の環境には非スレッドセーフのphp 5.4が入っているので、php_pdo_sqlsrv_54_nts.dllとphp_sqlsrv_54_nts.dllをphpの拡張ディレクトリ(例:C:\php\ext)にコピーします。

PHPの設定ファイル(例:"C:\php\php.ini")をテキストエディタで開き、「extension=xxx.dll」と拡張ドライバが列挙されているセクションに以下の2行を追加して保存します。

extension=php_pdo_sqlsrv_54_nts.dll
extension=php_sqlsrv_54_nts.dll

Webサーバを再起動し、「」を記述したページを開いて拡張機能が有効化されていることを確認します。PDOサポートとしてSQL Server のドライバが認識されています。
f:id:chorusde:20120622023226p:image:w500

SQL Server のドライバも認識されました。
f:id:chorusde:20120622023225p:image:w500

PHPから接続してみる

SQL Serverの「DEMO」と言うデータベースに「dbo(sa)」ユーザが所有する以下のような「employee」テーブルがある前提です。
f:id:chorusde:20120622023224p:image:w300

今回はPDO(PHP Data Object)を使用して接続します。まずはPDOオブジェクトを生成します。コンストラクタの定義はこちら。PDOオブジェクトのコンストラクタの第一引数であるDSN(Data Source Name)ですがSQL Serverの場合の記述は、ダウンロードしたドライバのzip内に含まれるchmに説明があり、以下のようになります。

"sqlsrv:server=[SQL Server インスタンス名];Database = [データベース名]"

今回は試しなので、ユーザ名からパスワードまでコードにべた書きです。

<?php
...
$serverName = 'demoserver';
$database = 'demo';
$uid = 'sa';
$pwd = 'password';
$conn = new PDO( "sqlsrv:server=$serverName;Database = $database", $uid, $pwd);
...
?>

次に作成したPDOオブジェクトを使用してSQL文を実行します。マニュアルはこちら

<?php
...
$sql = 'select * from dbo.employee';
foreach ($conn->query($sql) as $row) {
    //返された各行「$row」を使用した処理  
}
...
?>

最後に接続を切って終了です。

<?php
...
$conn = null;
...
?>

コード全体

テーブルが見やすいようにスタイルを定義してます(デザインセンスのかけらもないですが)。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>SQL Server につないでみる</title>
        <style type="text/css">
            table{
                border-color:black;
                border-style:solid;
                boder-widht:1px;
            }
            td{
                border-color:gray;
                border-style:solid;
                boder-widht:0.5px;
            }
        </style>
    </head>
    <body>
        <table>
	<caption>社員テーブル</caption>
	<tr>
		<td>ID</td>
		<td>社員名</td>
		<td>年齢</td>
	</tr>
        <?php
            //PDOオブジェクトの生成
            $serverName = 'demoserver';
            $database = 'demo';
            $uid = 'sa';
            $pwd = 'password';
            $conn = new PDO( "sqlsrv:server=$serverName;Database = $database", $uid, $pwd); 
            
            //SQL 実行
            $sql = 'select * from dbo.employee';
            foreach ($conn->query($sql) as $row) {
                print("<tr><td>".$row['emp_id']."</td>");
                print("<td>".$row['emp_name']."</td>");
                print("<td>".$row["emp_age"]."</td></tr>");  
            }
            
            // セッション解放 
            $conn = null;
        ?>
    </body>
</html>

実行結果

f:id:chorusde:20120622023223p:image:w250