クイックスタート:Microsoft Drivers for PHP for SQL Serverに接続しクエリを行使

このクイックスタートを使ってPHPドライバーをインストールし、Microsoft Entra IDでAzure SQLに接続し、AdventureWorksLTサンプルデータに対してパラメータ化 Transact-SQL(T-SQL)クエリを実行します。 SQLSRVプロシージャラルAPIかPDO_SQLSRV APIのいずれかを選択してください。 両方のサンプルは環境変数から接続設定を読み取り、同じ結果を返します。

クエリは製品データを読み込み、データベースオブジェクトは作成しません。

始める前に

1. PHPとドライバーをインストールする

オペレーティング システムを選択します。 コマンドブロック全体をコピーし、指定されたターミナルに貼り付けて実行します。

PowerShell を管理者として開きます。 このブロックをコピーして実行してください:

winget install --exact --id PHP.PHP.8.5 --source winget --accept-package-agreements --accept-source-agreements
winget install --exact --id Microsoft.msodbcsql.18 --source winget --accept-package-agreements --accept-source-agreements

$env:Path = [Environment]::GetEnvironmentVariable("Path", "Machine") + ";" +
    [Environment]::GetEnvironmentVariable("Path", "User")
New-Item -ItemType Directory -Force C:\php-quickstart | Out-Null
Set-Location C:\php-quickstart

$phpDirectory = Split-Path (Get-Command php.exe -ErrorAction Stop).Source
$phpIni = Join-Path $phpDirectory "php.ini"
if (-not (Test-Path $phpIni)) {
    Copy-Item (Join-Path $phpDirectory "php.ini-development") $phpIni
}

$configuration = [System.IO.File]::ReadAllText($phpIni)
$configuration = $configuration -replace '(?m)^\s*;\s*extension_dir\s*=\s*"ext"\s*$', 'extension_dir = "ext"'
$configuration = $configuration -replace '(?m)^\s*;\s*extension\s*=\s*openssl\s*$', 'extension=openssl'
$configuration = $configuration -replace '(?m)^\s*;\s*extension\s*=\s*zip\s*$', 'extension=zip'
[System.IO.File]::WriteAllText($phpIni, $configuration)

Invoke-WebRequest https://github.com/php/pie/releases/latest/download/pie.phar -OutFile pie.phar
php .\pie.phar install microsoft/sqlsrv
php .\pie.phar install microsoft/pdo_sqlsrv

php --version
php --ri sqlsrv
php --ri pdo_sqlsrv

最後の3つのコマンドはインストール済みのPHPおよび拡張機能のバージョンを表示します。 成功したら管理者ウィンドウを閉じてください。

もし php --ri コマンドのいずれかで拡張機能が存在しないと報告された場合は、先に インストールのトラブルシューティング に進んでください。

2. 接続情報の設定

OSのブロック内の <server> と <database> を置き換えてください。 PHPを実行するのと同じターミナルでブロック全体をコピーして実行してください。

Set-Location C:\php-quickstart
$env:SQL_SERVER = "tcp:<server>.database.windows.net,1433"
$env:SQL_DATABASE = "<database>"
$env:SQL_AUTHENTICATION = "ActiveDirectoryIntegrated"

Important

両方のサンプルは暗号化を有効にし、サーバー証明書の検証を行います。 サーバーがプライベート証明書局(CA)からの証明書を使用している場合は、発行するルート証明書と中間CA証明書をクライアントOSのトラストストアにインストールしてください。 SQL_SERVER を、証明書のサブジェクト代替名または共通名に含まれる名前に設定します。 そうでなければ、クエリが実行される前に接続が失敗します。 詳細については、信頼されていない証明書チェーンおよびSQL Server の暗号化の構成を参照してください。

TrustServerCertificate=true サーバーのアイデンティティ検証を回避します。 これは、プロダクションや共有環境の信頼構成としてではなく、孤立したローカルテスト環境の診断にのみ使用してください。

3. サンプルの作成と実行

1つのPHP APIを選びましょう。 選択したタブのコードを使って名前付きのファイルを作成し、その後にコマンドを実行します。

次のコードを使用して quickstart-sqlsrv.php を作成します。

<?php
declare(strict_types=1);

$server = getenv('SQL_SERVER') ?: null;
$database = getenv('SQL_DATABASE') ?: null;
$authentication = getenv('SQL_AUTHENTICATION') ?: null;

if ($server === null || $database === null || $authentication === null) {
    throw new RuntimeException('Set SQL_SERVER, SQL_DATABASE, and SQL_AUTHENTICATION.');
}
if (!in_array($authentication, ['SqlPassword', 'ActiveDirectoryIntegrated', 'ActiveDirectoryMsi'], true)) {
    throw new RuntimeException(
        'Set SQL_AUTHENTICATION to SqlPassword, ActiveDirectoryIntegrated, or ActiveDirectoryMsi.'
    );
}

$user = null;
$password = null;
if ($authentication === 'SqlPassword') {
    $user = getenv('SQL_USER') ?: null;
    $password = getenv('SQL_PASSWORD') ?: null;
    if ($user === null || $password === null) {
        throw new RuntimeException('Set SQL_USER and SQL_PASSWORD for SqlPassword authentication.');
    }
}

$options = [
    'Database' => $database,
    'Authentication' => $authentication,
    'Driver' => 'ODBC Driver 18 for SQL Server',
    'Encrypt' => true,
    'TrustServerCertificate' => false,
];
if ($authentication === 'SqlPassword') {
    $options['UID'] = $user;
    $options['PWD'] = $password;
}

$connection = sqlsrv_connect($server, $options);
if ($connection === false) {
    throw new RuntimeException(print_r(sqlsrv_errors(), true));
}

$sql = <<<'SQL'
SELECT TOP (5) ProductID, Name
FROM SalesLT.Product
WHERE ProductID > ?
ORDER BY ProductID;
SQL;
$parameters = [0];
$statement = sqlsrv_query($connection, $sql, $parameters);
if ($statement === false) {
    $errors = sqlsrv_errors();
    sqlsrv_close($connection);
    throw new RuntimeException(print_r($errors, true));
}

$rows = [];
while (($row = sqlsrv_fetch_array($statement, SQLSRV_FETCH_ASSOC)) !== null) {
    if ($row === false) {
        $errors = sqlsrv_errors();
        sqlsrv_free_stmt($statement);
        sqlsrv_close($connection);
        throw new RuntimeException(print_r($errors, true));
    }
    $rows[] = $row;
}
sqlsrv_free_stmt($statement);
sqlsrv_close($connection);

if (count($rows) !== 5) {
    throw new RuntimeException('Unexpected query result.');
}
$previousProductId = 0;
foreach ($rows as $row) {
    if ($row['ProductID'] <= $previousProductId || $row['Name'] === '') {
        throw new RuntimeException('Unexpected query result.');
    }
    $previousProductId = $row['ProductID'];
}
printf("%-12s%s\n", 'Product ID', 'Name');
printf("%-12s%s\n", '----------', '----');
foreach ($rows as $row) {
    printf("%-12d%s\n", $row['ProductID'], $row['Name']);
}

サンプルを実行します。

php quickstart-sqlsrv.php

4. 結果の検証

商品列はAdventureWorksLTのバージョンによって異なる場合があります。 両方のサンプルは、この例に似た出力を返します。

Product ID  Name
----------  ----
680         HL Road Frame - Black, 58
706         HL Road Frame - Red, 58
707         Sport-100 Helmet, Red
708         Sport-100 Helmet, Black
709         Mountain Bike Socks, M

各サンプルは、行を印刷する前に、空でない名前と昇順の商品IDを持つ5つの商品がクエリで返されたかどうかを確認します。 その後、ステートメントを解放し、接続を終了します。 クエリはデータベースのオブジェクトやデータを削除するものを残しません。

別の認証方法を使います

サンプルはPHPファイルを変更することなく管理IDおよびSQL Server認証も受け入れています。

マネージド ID

Azureでホストされているアプリケーションの場合、マネージドIDを有効にしてデータベースユーザーを作成します。 アプリケーションの設定でサーバー、データベース、認証モードを設定します:

SQL_SERVER=tcp:<server>.database.windows.net,1433
SQL_DATABASE=<database>
SQL_AUTHENTICATION=ActiveDirectoryMsi

SQL_USERまたはSQL_PASSWORDを設定しないでください。

Microsoft FabricのSQLデータベースでは、Fabricのアクセス制御を通じて「アイテムの読み取り」権限をIDに付与します。 データベースの項目からSQL接続エンドポイントを使い、SQL分析エンドポイントは使いません。 FabricのSQLデータベースはSQL認証をサポートしていません。

SQL Server認証

SQL Server認証は、自分が制御するSQL Serverインスタンス、例えば孤立したローカル開発コンテナにのみ使ってください。 認証情報はアプリケーション設定や秘密ストアに保管してください。 ソース管理にコミットしないでください。

$env:SQL_SERVER = "tcp:<server>,1433"
$env:SQL_DATABASE = "<database>"
$env:SQL_AUTHENTICATION = "SqlPassword"
$env:SQL_USER = "<user_id>"
$env:SQL_PASSWORD = "<password>"

その他のMicrosoft Entra認証方法については、「Microsoft Entra認証を使ったConnect 」をご覧ください。

インストールのトラブルシューティング

インストールブロックが停止したり、検証コマンドが失敗した場合にこれらのチェックを用いてください。

Get-Command php.exe
php --ini
php --ri sqlsrv
php --ri pdo_sqlsrv
Get-OdbcDriver -Name "ODBC Driver 18 for SQL Server"

Get-Command php.exe見つからなければ、すべてのターミナルを閉じて新しいPowerShellウィンドウを開き、再度チェックを実行してください。 php --riコマンドで拡張が存在しないと報告した場合は、C:\php-quickstartからPIEインストールコマンドを再実行してください。

もし接続が FA001 を報告し、Integrated Securityでは認証オプションが使えないと言われたら、 SQL_AUTHENTICATION が正確に ActiveDirectoryIntegratedであることを確認してください。 php --ri sqlsrvかphp --ri pdo_sqlsrvを実行してPHPドライバーのバージョンを確認し、5.10.1より古いドライバーなら更新してください。

クリーンアップ

サンプルは声明を発表し、接続を閉じます。 データベースオブジェクトを作成したり、データを永続化したりするわけではありません。

接続設定は現在のターミナルセッションに適用されます。 終わったら端末を閉じろ。

本番の再試行、タイムアウト、ログ、フェイルオーバー設定では、この初回サンプルを拡張する代わりに 本番ベースライン を使用してください。