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 からダウンロード可能です。 また、バイナリはマイクロソフトのダウンロードセンターからダウンロードできます。
- SQL Server Driver for PHP 1.1 [10/6/2009]
- SQL Server Driver for PHP 1.0.8204[5/5/2009]
バージョン 1.1 に含まれる dll は次の通りです。
Driver File | PHP バージョン | スレッドセーフ | PHP.dll |
---|---|---|---|
php_sqlsrv_53_nts_vc6.dll | 5.3 | No | php5.dll |
php_sqlsrv_53_nts_vc9.dll | 5.3 | No | php5.dll |
php_sqlsrv_53_ts_vc6.dll | 5.3 | Yes | php5ts.dll |
php_sqlsrv_53_ts_vc9.dll | 5.3 | Yes | php5ts.dll |
php_sqlsrv_52_nts_vc6.dll | 5.2 | No | php5.dll |
php_sqlsrv_52_ts_vc6.dll | 5.2 | Yes | php5ts.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 リファレンスにも記載がありますので、ご覧ください。