PHPからSQL Serverに接続してみよう:.NET開発者のためのPHPアプリお手軽開発入門(2/2 ページ)
PHPからSQL Serverに接続するには、Microsoftが提供するPHP拡張機能が必要だ。そのセットアップをし、接続を確認する簡単なコードを書いてみよう。
PHP for SQL Server driverを使ってSQL Serverへ接続
まずはPHP for SQL Server driverを使って、SQL Serverに接続してみよう。なお、本稿では既に述べた通り、SQL Server LocalDBを使用している。また、以下のコマンドを実行して、「vscphpwebapps」というLocalDBインスタンスを作成している。
> sqllocaldb create vscphpwebapps
このインスタンス上に「test」というデータベースを作成して、そこに「sample」というテーブルを作成した。
PHP for SQL Server driverが提供するAPIを使用して、このデータを取得するコードを以下に示す。
<?php
$serverName = "(localdb)\\vscphpwebapps";
$uid = "sa";
$pwd = "**********"; // saアカウントのパスワード
$connInfo = ["UID" => $uid, "PWD" => $pwd, "Database" => "test"];
$conn = sqlsrv_connect($serverName, $connInfo);
$tsql = "SELECT * from sample";
$stmt = sqlsrv_query($conn, $tsql);
while ($row = sqlsrv_fetch_array($stmt)) {
echo "name: " . $row["name"] . ", country: " . $row["address"] . PHP_EOL;
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
PHP for SQL Server driverが提供するAPIは「sqlsrv_」で始まる。APIの詳細なドキュメントは「SQLSRV Driver API Reference」ページから参照できる。
ここでは以下のAPIを使用している。
- sqlsrv_connect関数:指定したSQL Server/データベースに接続し、コネクションリソースを返送する
- sqlsrv_query関数:クエリの準備と実行を行い、作成したステートメントリソースを返送する(sqlsrv_prepare/sqlsrv_execute関数の両者を一度に実行するのと同様)
- sqlsrv_fetch_array関数:行データを取得し、配列として返送する
- sqlsrv_free_stmt関数:作成したステートメントリソースを解放する
- sqlsrv_close関数:接続を解除して、関連リソースを解放する
sqlsrv_connect関数とsqlsrv_close関数が対に、sqlsrv_query関数(あるいはsqlsrv_prepare関数)とsqlsrv_free_stmt関数が対になっていることに注意。sqlsrv_connect関数の引数に渡している連想配列はデータベース名と接続オプションだ。接続オプションについては「Connection Options」ページを参照してほしいが、ここでは以下を指定している。
- UIDキー:ユーザーIDを指定
- PWDキー:UIDキーで指定したユーザーのパスワード
- Databaseキー:その接続で使用するデータベース
サンプルということで、上のコードではUIDキーの値としてSQL Serverのsaアカウントを使用したが、デフォルトではこのアカウントはログインを許可されていないので、上のコードをそのまま実行してみるのであればログインを有効にして(パスワードも再設定して)おく必要がある(SQL Server認証が有効になっている必要もある)。以下はSQL Server Management Studioでオブジェクトエクスプローラーの[セキュリティ]ツリーを展開して、saアカウントを右クリックしてプロパティを表示し、ログインを有効化しているところだ(あまりお勧めではない)。
最後にsqlsrv_fetch_array関数は「次の行データを配列または連想配列として取得」する。行データがなければ、falseを返送するのでwhile文でループしている(foreachによる反復処理をしたい方は次節の「PDOを使ったSQL Serverへのアクセス」を参照されたい)。上のコードでは連想配列として"name"や"address"といったキーを使用しているが、「$row[1]」のように数値のインデックスを指定することももちろん可能だ(が、連想配列のキーを使用した方が簡単だろう)。
上のコードをVS CodeのCode Runner拡張機能を使って実行した結果を以下に示す。
このようにPHP for SQL Server driverが提供するAPIを使用することで、SQL Serverからのデータの取得ができた。次に、PHPのPDOを使って同様なコードを記述してみよう。
PDOを使ったSQL Serverへのアクセス
既に述べた通り、PDO(PHP Data Objects)は実際に接続を行うデータベースに関係なく、データベースアクセスを抽象化したインタフェースを提供する。これをサポートするための拡張機能が先ほどextディレクトリに配置したphp_pdo_sqlsrv_72_nts_x64.dllファイルだ。
実際には、PDOクラスのインスタンスを生成することで、データベース接続が確立される。PDOクラスを利用してSQL Serverにアクセスするコードを以下に示す。
<?php
$serverName = "(localDB)\\vscphpwebapps";
$uid = "sa";
$pwd = "**********";
$dbname = "test";
$dsn = "sqlsrv:server=" . $serverName . ";database=" . $dbname;
$conn = new PDO($dsn, $uid, $pwd);
$tsql = "SELECT * from sample";
$stmt = $conn->query($tsql);
while ($row = $stmt->fetch()) {
echo "name: " . $row["name"] . ", country: " . $row["address"] . PHP_EOL;
}
/*
foreach($stmt as $row) {
echo "name: " . $row["name"] . ", country: " . $row["address"] . PHP_EOL;
}
*/
なるべく先ほどのPHP for SQL Server driverと似たコードとなるようにしたことで、若干冗長な部分がある。PDOクラスのコンストラクタにはデータソース名(Data Source Name、DSN)とユーザー名、パスワードを渡して、インスタンスを生成している。データベースが異なると、DSNの書き方も異なってくるので、他のデータベースを使うときには「PDO ドライバ」ページ以下でそれぞれのDSNの書き方を参考にしてほしい(注意してほしいのは、このページには「MS SQL Server (PDO)」というリンクが2つあること。本稿で取り上げたPHP for SQL Server driverに同梱のPDO_SQLSRV拡張機能に対応するのは2つ目のリンクだ)。
SQL Serverに接続する場合、データソース名は「sqlsrv:」という接頭辞で始まり、その後に各種要素を「要素=値」という形式で追加していく(セミコロン区切り)。指定可能な要素については「PDO_SQLSRV DSN」ページを参照のこと。ここでは以下の2つの要素を指定して、「sqlsrv:Server=……;Database=……」のようになっている。
- Server:接続するデータベースサーバ
- Database:使用するデータベース
作成したPDOインスタンスに対して、queryメソッドを呼び出すことで、SQLステートメントを実行できる。上のコードでは、このときに返送されるオブジェクト(PDOStatementオブジェクト)を使い、whileループを廻しながら、fetchメソッドで行データを取得して、それを表示しているが、コメントアウトした部分にあるように、反復処理も行える。foreach文でデータを順次処理できるので、C#に慣れた人にはこちらの方が気持ちよいコードになるはずだ。また、sqlsrv_〜という関数が出てこなかったことにも注意されたい(PDOがデータベースアクセスを抽象化してくれているため)。
実行結果は次の通り(PHP for SQL Server driverのときと同様)。
今回はPHPからSQL Serverに接続するために必要なセットアップと、実際に接続できるかを確認する簡単なPHPコードを記述した。PHPとIIS、SQL Serverを連携させる準備がこれで整ったので、次回からはもう少し本格的なアプリを作っていこう。
Copyright© Digital Advantage Corp. All Rights Reserved.