Web/DB プログラミング徹底解説

ホーム > PHP プログラミング > PHP から MS SQL Server へ接続する方法のまとめとサンプルコード

PHP から MS SQL Server へ接続する方法のまとめとサンプルコード

スポンサーリンク

この資料では PHP 5 から マイクロソフト SQL サーバー (MS SQL Server 2005/2008) へと接続するための、sqlsrv 拡張 (エクステンション) の利用方法について、 必要なソフトウェア、コードの書き方についてまとめます。

必要なソフトウェア

PHP5 から MS SQL Server 2005/2008 へ接続するには、SQL Server Driver for PHP を利用することが出来ます。

SQL Server Driver for PHP は PHP エクステンション (sqlsrv_*.dll) として実装されています。 このエクステンションの関数 (API) を呼び出すことで、SQL Server に対してクエリを実行します。

SQL Server Driver for PHP のソースコードは Codeplex からダウンロード可能です。 また、バイナリはマイクロソフトのダウンロードセンターからダウンロードできます。

バージョン 1.1 に含まれる dll は次の通りです。

Driver FilePHP バージョンスレッドセーフPHP.dll
php_sqlsrv_53_nts_vc6.dll5.3Nophp5.dll
php_sqlsrv_53_nts_vc9.dll5.3Nophp5.dll
php_sqlsrv_53_ts_vc6.dll5.3Yesphp5ts.dll
php_sqlsrv_53_ts_vc9.dll5.3Yesphp5ts.dll
php_sqlsrv_52_nts_vc6.dll5.2Nophp5.dll
php_sqlsrv_52_ts_vc6.dll5.2Yesphp5ts.dll

サポートバージョンが非常に限定的なあたりは、いかにもマイクロソフト流ですね (苦笑)

エクステンションのインストール

上記のパッケージを展開して取得できた dll を PHP エクステンションディレクトリに保存します。

PHP のエクステンションディレクトリは、php.ini にて、extension_dir で定義されています。 例えば次の場合、エクステンションディレクトリは C:\php\ext です。

extension_dir="C:\php\ext"

これは特に SQL Server Driver for PHP 専用の設定というわけではありません。

プログラミング手順

ここでは典型的なプログラミング・コードサンプルを示します。

データベースへの接続

SQL Server との接続を確立するには、sqlsrv_connect 関数を利用します。

以下の例では SQL サーバー認証を用いて、PHP から SQL Server への接続を確立する例を示します。 'ID' と 'PWD' をパラメータとしてクレデンシャルを設定し、認証します。 'ID' と 'PWD' を設定しない場合、デフォルトで Windows 認証を利用します。

<?php
$serverName = '.\\SQLEXPRESS';
$connectionInfo = array( 
     'UID' => 'sa',
     'PWD' => 'password goes here',
     'Database' => 'Northwind' 
);

$conn = sqlsrv_connect( $serverName, $connectionInfo );

if( $conn === false ){
     echo "Cound not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

クエリの実行と結果の取得

sqlsrv_query 関数 は SQL サーバーへの接続と SQL ステートメントやパラメータを受け取り、SQL 文を実行し ステートメントリソースを返します。 sqlsrv_query で返されたステートメントリソースと sqlsrv_fetch_array 関数sqlsrv_fetch_object 関数 を用いることによって、結果行のデータを取得します。

尚、sqlsrv_fetch_array 関数 では結果行のカラムへは、配列のインデックスまたはカラム名でアクセス可能です。 インデックスのみ、カラム名のみでのアクセスを可能とするには、それぞれ SQLSRV_FETCH_NUMERIC あるいは SQLSRV_FETCH_ASSOC を指定します。 (既定では SQLSRV_FETCH_BOTH を指定した場合と等価となるため、インデックス及びカラム名の両方でアクセス可能となります)

<?php
$serverName = '.\\SQLEXPRESS';
$connectionInfo = array( 
     'UID' => 'sa',
     'PWD' => 'password',
     'Database' => 'Northwind' 
);

$conn = sqlsrv_connect( $serverName, $connectionInfo );

if( $conn === false ){
     echo "Cound not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

$tsql = 
     "SELECT CustomerID, CompanyName, ContactName 
     FROM customers 
     WHERE companyname LIKE 'R%'";

$stmt = sqlsrv_query( $conn, $tsql );

if( !$stmt ) {
     die( print_r( sqlsrv_errors(), true));
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC)) {
     echo "$row[1] ($row[2])\n";
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

サンプルコード

<?php
$serverName = '.\\SQLEXPRESS';
$connectionInfo = array( 
     'UID' => 'sa',
     'PWD' => 'password',
     'Database' => 'Northwind' 
);

$conn = sqlsrv_connect( $serverName, $connectionInfo );

if( $conn === false ){
     echo "Cound not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

$tsql = 
     "SELECT CustomerID, CompanyName, ContactName 
     FROM customers 
     WHERE companyname LIKE 'R%'";

$stmt = sqlsrv_query( $conn, $tsql );

if( !$stmt ) {
     die( print_r( sqlsrv_errors(), true));
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC)) {
     echo "$row[1] ($row[2])\n";
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

その他の例は SQL Server Driver for PHP リファレンスにも記載がありますので、ご覧ください。

スポンサーリンク