Rychlý začátek: Připojte se a dotazujte pomocí Microsoft ovladačů pro PHP pro SQL Server

Použijte tento rychlý start k instalaci PHP ovladačů, připojte se k Azure SQL s vaší Microsoft Entra identitou a spusťte parametrizovaný dotaz Transact-SQL (T-SQL) proti vzorkovým datůmAdventureWorksLT. Vyberte buď procedurální API SQLSRV, nebo API PDO_SQLSRV. Obě ukázky načítají nastavení připojení z proměnných prostředí a vracejí stejný výsledek.

Dotaz čte produktová data a nevytváří databázové objekty.

Než začnete

1. Nainstalovat PHP a ovladače

Vyberte svůj operační systém. Zkopírujte celý příkazový blok, vložte ho do určeného terminálu a spusťte ho.

Spusťte PowerShell jako správce. Zkopírujte a spusť tento blok:

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

Poslední tři příkazy zobrazují nainstalované verze PHP a rozšíření. Po úspěchu zavřete administrátorské okno.

Pokud některý php --ri z příkazů hlásí, že rozšíření chybí, přejděte do Installation Troubleshooting než budete pokračovat.

2. Nastavte informace o spojení

Nahraďte <server> a <database> v bloku pro váš operační systém. Zkopírujte a spusť celý blok ve stejném terminálu, který budete používat pro spuštění PHP.

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

Important

Oba vzorky umožňují šifrování a ověřují serverový certifikát. Pokud váš server používá certifikát od soukromé certifikační autority (CA), nainstalujte vydávající root a mezistupeň CA certifikáty do klientského úložiště důvěry operačního systému. Nastavte pro SQL_SERVER název uvedený v poli Subject Alternative Name nebo Common Name certifikátu. Jinak spojení selže dříve, než dotaz proběhne. Pro více informací viz Certifikátový řetězec není důvěryhodný a Konfigurovat šifrování SQL Server.

TrustServerCertificate=true Obchází ověřování identity serveru. Používejte ho pouze k diagnostice izolovaného lokálního testovacího prostředí, nikoli jako konfiguraci důvěry pro produkční nebo sdílená prostředí.

3. Vytvořit a spustit vzorek

Vyberte jedno PHP API. Vytvořte pojmenovaný soubor pomocí kódu ve vybrané záložce a poté spusťte příkaz po kódu.

Vytvořte quickstart-sqlsrv.php pomocí následujícího kódu:

<?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']);
}

Spusťte ukázku:

php quickstart-sqlsrv.php

4. Ověřit výsledek

Produktové řádky se mohou lišit podle verze AdventureWorksLT. Oba vzorky vracejí výstup podobný tomuto příkladu:

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

Každý příklad kontroluje, že dotaz vrátil pět produktů s neprázdnými názvy a vzestupnými ID produktů před vypsáním řádků. Poté uvolní prohlášení a ukončí spojení. Dotaz nezanechává žádné databázové objekty ani data k odstranění.

Použijte jinou metodu autentizace

Ukázky také přijímají spravovanou identitu a autentizaci přes SQL Server bez změny PHP souborů.

Spravovaná identita

Pro aplikaci hostovanou v Azure povolte spravovanou identitu a vytvořte jejího databázového uživatele. Nastavte server, databázi a autentizační režim v konfiguraci aplikace:

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

Nenastavujte SQL_USER nebo SQL_PASSWORD.

Pro SQL databázi v Microsoft Fabric udělte identitě oprávnění k čtení položky přes Fabric access control. Použijte koncový bod SQL připojení z položky databáze, ne koncový bod SQL analýzy. SQL databáze ve Fabric nepodporuje SQL autentizaci.

Ověřování SQL Serveru

Používejte autentizaci SQL Server pouze pro instanci SQL Server, kterou ovládáte, například izolovaný lokální vývojový kontejner. Přihlašovací údaje si uchovávejte v konfiguraci aplikací nebo v tajném úložišti. Nezavazujte je ke kontrole zdrojového kódu.

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

Pro další metody autentizace Microsoft Entra viz Připojit pomocí autentizace Microsoft Entra.

Řešení problémů při instalaci

Tyto kontroly použijte v případě, že se instalační blok zastaví nebo pokud ověřovací příkaz selže.

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

Pokud Get-Command nenajdeš php.exe, zavřeš všechny terminály, otevři nové PowerShell okno a znovu proběhni kontroly. Pokud příkaz php --ri hlásí Rozšíření není k dispozici, znovu spusťte instalační příkazy PIE z C:\php-quickstart.

Pokud připojení hlásí FA001 a uvádí, že možnost Authentication nelze použít s Integrated Security, ověřte, že hodnota SQL_AUTHENTICATION je přesně ActiveDirectoryIntegrated. Spusť php --ri sqlsrv nebo php --ri pdo_sqlsrv zkontrolovat verzi PHP ovladače a aktualizovat ovladač, pokud je starší než 5.10.1.

Vyčištění

Vzorky zveřejňují svá prohlášení a uzavírají své kontakty. Nevytvářejí databázové objekty ani neuchovávají data.

Nastavení připojení platí pro aktuální relaci terminálu. Až skončíš, zavřeš terminál.

Pro nastavení produkčního opakovaného pokusu, timeoutu, logování a failoveru použijte produkční základní hodnotu místo rozšiřování tohoto prvního vzorku.