利用这个快速入门工具安装PHP驱动程序,用你的Microsoft Entra身份连接到Azure SQL,并对样本数据运行参数化 Transact-SQL(T-SQL)查询AdventureWorksLT。 选择 SQLSRV 程序式 API 或 PDO_SQLSRV API。 两个样本都从环境变量读取连接设置,结果相同。
查询读取产品数据,不创建数据库对象。
在您开始之前
- 创建或连接到包含
AdventureWorksLT样本数据的数据库。 关于Azure SQL 数据库、Microsoft Fabric中的SQL数据库、SQL Server和SQL Server容器的设置说明,请参见AdventureWorks示例数据库。 - 请让数据库管理员为你的 Microsoft Entra 身份创建一个数据库用户。
- 在Windows上,使用有数据库访问权限的Windows账户登录。
- 在 macOS 或 Linux 上,为 Microsoft Entra 联合帐户获取 Kerberos 票证。 有关需求,请参见“使用Microsoft Entra ID配合ODBC驱动。
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)的证书,请在客户端操作系统的信任存储中安装发出根证书和中间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-Command 找不到 php.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之前的,请 更新 。
清理
示例会释放其语句并关闭连接。 它们不创建数据库对象或持久化数据。
连接设置适用于当前的终端会话。 完成后关闭终端。
对于生产环境中的重试、超时、日志记录和故障切换设置,请使用生产基线,而不要在此首次运行示例的基础上进行扩展。