Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте этот быстрый старт, чтобы установить драйверы PHP, подключиться к Azure SQL с вашей Microsoft Entra идентичностью и выполнить параметризованный Transact-SQL (T-SQL) запрос к AdventureWorksLT примерным данным. Выберите либо процедурный API SQLSRV, либо API PDO_SQLSRV. Оба сэмпла считывают настройки соединения из переменных среды и возвращают одинаковый результат.
Запрос читает данные продукта и не создаёт объекты базы данных.
Перед началом работы
- Создайте или подключитесь к базе данных, содержащей
AdventureWorksLTобразцы данных. Инструкции по настройке База данных SQL Azure, базы данных SQL в Microsoft Fabric, SQL Server и контейнеров SQL Server см. в разделе образцы баз данных AdventureWorks. - Попросите администратора базы данных создать пользователя базы данных для вашего идентификатора Microsoft Entra.
- В Windows войдите с аккаунтом Windows, имеющим доступ к базе данных.
- На macOS или Linux получите билет Kerberos для федеративной учетной записи Microsoft Entra. Для получения требований см. раздел «Использование 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 значение имени, указанного в Subject Alternative Name (SAN) или Common Name (CN) сертификата. В противном случае соединение прервётся до запуска запроса. Для получения дополнительной информации см. «Цепочка сертификатов не является доверенной» и «Настройка шифрования SQL Server».
TrustServerCertificate=true обходит проверку идентичности сервера. Используйте его только для диагностики изолированной локальной тестовой среды, а не как конфигурацию доверия для производственных или общих сред.
3. Создайте и запустите образец
Выберите API PHP. Создайте именованный файл, используя код на выбранной вкладке, а затем выполните команду после кода.
Создайте 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
Каждый пример проверяет, что запрос вернул пять товаров с непустыми именами и идентификаторами, расположенными по возрастанию, прежде чем выводить строки. Затем освобождается инструкция и закрывается соединение. Запрос не оставляет объектов или данных базы данных для удаления.
Используйте другой метод аутентификации
Сэмплы также поддерживают управляемую идентификацию и аутентификацию SQL Server без изменения PHP-файлов.
Манажируемая идентичность
Для приложения, размещённого в Azure, включите управляемую идентичность и создайте его пользователя базы данных. Установите режим сервера, базы данных и аутентификации в конфигурации приложения:
SQL_SERVER=tcp:<server>.database.windows.net,1433
SQL_DATABASE=<database>
SQL_AUTHENTICATION=ActiveDirectoryMsi
Не задавайте SQL_USER или SQL_PASSWORD.
Для SQL базы данных в Microsoft Fabric предоставьте идентификатору разрешение на чтение элемента через системы доступа Fabric. Используйте SQL-конечную точку подключения из элемента базы данных, а не конечную точку SQL analytics. SQL база данных в Fabric не поддерживает 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 см. раздел «Connect using Microsoft Entra authentication».
Диагностика неполадок установки
Используйте эти проверки, если блок установки остановится или команда проверки не работает.
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 выводит сообщение Расширение отсутствует, повторно выполните команды установки PIE из C:\php-quickstart.
Если соединение выдаёт сообщение FA001 и указывает, что параметр Authentication нельзя использовать с Integrated Security, убедитесь, что значение SQL_AUTHENTICATION точно равно ActiveDirectoryIntegrated. Запустите php --ri sqlsrv или php --ri pdo_sqlsrv проверьте версию драйвера PHP и обновите драйвер , если он старше 5.10.1.
Очистка
Образцы публикуют свои заявления и закрывают связи. Они не создают объекты базы данных и не сохраняют данные.
Настройки соединения применимы к текущей сессии терминала. Закрой терминал, когда закончишь.
Для настройки повторных попыток, тайм-аута, логирования и переключения при отказе в рабочей среде используйте базовую конфигурацию production вместо расширения этого примера для первого запуска.