快速入门:使用适用于 SQL Server 的 Microsoft PHP 驱动程序进行连接和查询

利用这个快速入门工具安装PHP驱动程序,用你的Microsoft Entra身份连接到Azure SQL,并对样本数据运行参数化 Transact-SQL(T-SQL)查询AdventureWorksLT。 选择 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

最后三个命令显示已安装的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之前的,请 更新 。

清理

示例会释放其语句并关闭连接。 它们不创建数据库对象或持久化数据。

连接设置适用于当前的终端会话。 完成后关闭终端。

对于生产环境中的重试、超时、日志记录和故障切换设置,请使用生产基线,而不要在此首次运行示例的基础上进行扩展。