利用這個快速入門工具安裝 PHP 驅動程式,用你的 Microsoft Entra 身份連接 Azure SQL,並對範例資料執行參數化 Transact-SQL(T-SQL)查詢AdventureWorksLT。 選擇 SQLSRV 程序式 API 或 PDO_SQLSRV API。 兩個取樣都從環境變數讀取連線設定,並回傳相同的結果。
查詢會讀取產品資料,並不會建立資料庫物件。
開始之前
- 建立或連接包含
AdventureWorksLT樣本資料的資料庫。 關於 Azure SQL Database、Microsoft Fabric 中的 SQL 資料庫、SQL Server 及 SQL Server 容器的設定說明,請參閱 AdventureWorks 範例資料庫。 - 請資料庫管理員為你的 Microsoft Entra 身份建立一個資料庫使用者。
- 在 Windows 上,請用有資料庫存取權的 Windows 帳號登入。
- 在 macOS 或 Linux 上,取得同盟式 Microsoft Entra 帳戶的 Kerberos 票證。 如需瞭解相關需求,請參閱 搭配 ODBC 驅動程式使用 Microsoft Entra ID。
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
最後三個指令顯示已安裝的 PHP 及擴充套件版本。 成功後關閉管理員視窗。
如果任一 php --ri 指令都顯示擴充功能不存在,請先進入 安裝故障排除 頁面再繼續。
2. 設定連線資訊
在適用於你的作業系統的區塊中替換 <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)的憑證,請在用戶端作業系統的信任儲存庫中安裝發出的根憑證和中間憑證。 設定 SQL_SERVER 為證書主題、替代名稱或通用名稱中的名稱。 否則,連線會在查詢執行前失敗。 欲了解更多資訊,請參閱「不信任憑證鏈」及「配置 SQL Server 加密」。
TrustServerCertificate=true 繞過伺服器身份驗證。 僅用於診斷隔離的本地測試環境,而非作為生產環境或共享環境的信任配置。
3. 建立並執行樣本
選擇一個 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 依遞增順序排列的產品,然後才列印這些資料列。 接著它會釋放該語句並關閉連線。 查詢不會留下任何資料庫物件或資料可移除。
請使用其他認證方法
這些範例也接受管理身份與 SQL Server 認證,且不需更改 PHP 檔案。
受管理的識別
對於在 Azure 中託管的應用程式,啟用管理身份並建立其資料庫使用者。 在應用程式設定中設定伺服器、資料庫及認證模式:
SQL_SERVER=tcp:<server>.database.windows.net,1433
SQL_DATABASE=<database>
SQL_AUTHENTICATION=ActiveDirectoryMsi
不要設定 SQL_USER 或 SQL_PASSWORD。
對於 Microsoft Fabric 中的 SQL 資料庫,請透過 Fabric 存取控制賦予身份「讀取項目」權限。 請使用資料庫項目中的 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 認證連接。
安裝故障排除
如果安裝區塊停止或驗證指令失敗,請使用這些檢查。
Get-Command php.exe
php --ini
php --ri sqlsrv
php --ri pdo_sqlsrv
Get-OdbcDriver -Name "ODBC Driver 18 for SQL Server"
找不到Get-Commandphp.exe就關閉所有終端機,開啟新的 PowerShell 視窗,然後重新執行檢查。 如果某個 php --ri 指令顯示 Extension not present,請從 C:\php-quickstart 重新執行 PIE 安裝指令。
如果連線回報 FA001,並指出 Authentication 選項無法與 Integrated Security 搭配使用,請確認 SQL_AUTHENTICATION 完全等於 ActiveDirectoryIntegrated。 執行 php --ri sqlsrv 或 php --ri pdo_sqlsrv 檢查 PHP 驅動版本,如果驅動程式超過 5.10.1 就 更新 。
收拾整理
樣本會發表聲明並關閉彼此的連結。 它們不會建立資料庫物件或持久化資料。
連線設定會套用至目前的終端機工作階段。 完成後關上終端機。
對於生產重試、逾時、日誌記錄及故障轉移設定,請使用 生產基線 ,而非延長首批樣本。