Snabbstart: Anslut och sök med Microsoft Drivers för PHP för SQL Server

Använd denna quickstart för att installera PHP-drivrutinerna, koppla upp dig mot Azure SQL med din Microsoft Entra identitet och kör en parameteriserad Transact-SQL (T-SQL)-fråga mot AdventureWorksLT exempeldatan. Välj antingen SQLSRV-procedur-API:et eller PDO_SQLSRV-API:et. Båda proverna läser anslutningsinställningar från miljövariabler och ger samma resultat.

Frågan läser produktdata och skapar inga databasobjekt.

Innan du börjar

1. Installera PHP och drivrutinerna

Välj ditt operativsystem. Kopiera hela kommandoblocket, klistra in det i den angivna terminalen och kör det.

Öppna PowerShell som administratör. Kopiera och kör detta block:

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

De tre sista kommandona visar installerade PHP- och tilläggsversioner. Stäng administratörsfönstret efter att de lyckats.

Om något av php --ri kommandona rapporterar att tillägget inte finns, gå till felsökning i installation innan du fortsätter.

2. Ange anslutningsinformation

Ersätt <server> och <database> i blocket för ditt operativsystem. Kopiera och kör hela blocket i samma terminal som du ska använda för att köra PHP.

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

Important

Båda proverna möjliggör kryptering och validerar servercertifikatet. Om din server använder ett certifikat från en privat certifikatutnämnare (CA), installera de utfärdande root- och mellancertifikaten i klientoperativsystemets förtroendelager. Ställ SQL_SERVER in till ett namn i certifikatets Ämnesalternativ eller Vanligt Namn. Annars misslyckas anslutningen innan frågan körs. För mer information, se Certifikatkedja inte betrodd och Konfigurera SQL Server-kryptering.

TrustServerCertificate=true Kringgår validering av serveridentitet. Använd det endast för att diagnostisera en isolerad lokal testmiljö, inte som en förtroendekonfiguration för produktions- eller delade miljöer.

3. Skapa och köra ett prov

Välj ett PHP-API. Skapa den namngivna filen genom att använda koden i den valda fliken och kör sedan kommandot efter koden.

Skapa quickstart-sqlsrv.php med följande kod:

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

Kör exemplet:

php quickstart-sqlsrv.php

4. Verifiera resultatet

Produktraderna kan variera beroende på AdventureWorksLT-version. Båda proverna ger en utgång som liknar detta exempel:

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

Varje exempel kontrollerar att sökningen returnerar fem produkter med icke-tomma namn och stigande produkt-ID innan raderna skrivs ut. Den släpper sedan uttalandet och stänger anslutningen. Frågan lämnar inga databasobjekt eller data att ta bort.

Använd en annan autentiseringsmetod

Exemplen accepterar också managed identity och SQL Server-autentisering utan att ändra PHP-filerna.

Hanterad identitet

För en applikation som är värd i Azure, aktivera en hanterad identitet och skapa dess databasanvändare. Ställ in server, databas och autentiseringsläge i applikationens konfiguration:

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

Ställ inte in SQL_USER eller SQL_PASSWORD.

För SQL-databas i Microsoft Fabric, ge identiteten Read-elementbehörighet via Fabric-åtkomstkontroller. Använd SQL-anslutningsslutpunkten från databasobjektet, inte SQL-analys-slutpunkten. SQL-databasen i Fabric stöder inte SQL-autentisering.

SQL Server-autentisering

Använd SQL Server-autentisering endast för en SQL Server-instans som du kontrollerar, till exempel en isolerad lokal utvecklingscontainer. Spara uppgifter i applikationskonfigurationen eller i en hemlig lagring. Bind dem inte till källkodskontroll.

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

För andra autentiseringsmetoder för Microsoft Entra, se Connect using Microsoft Entra authentication.

Felsökning vid installation

Använd dessa kontroller om installationsblocket stannar eller om ett verifieringskommando misslyckas.

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

Om Get-Command inte kan hitta php.exe, stäng alla terminaler, öppna ett nytt PowerShell-fönster och kör kontrollerna igen. Om ett php --ri kommando rapporterar att Extension inte är närvarande, kör om PIE-installationskommandona från C:\php-quickstart.

Om en anslutning rapporterar FA001 och säger att autentiseringsalternativet inte kan användas med Integrated Security, bekräfta att det SQL_AUTHENTICATION är exakt ActiveDirectoryIntegrated. Kör php --ri sqlsrv eller php --ri pdo_sqlsrv kontrollera PHP-drivrutinsversionen och uppdatera drivrutinen om den är äldre än 5.10.1.

Städa upp

Proverna släpper sina uttalanden och stänger sina kopplingar. De skapar inte databasobjekt eller lagrar inte data.

Anslutningsinställningarna gäller för den aktuella terminalsessionen. Stäng terminalen när du är klar.

För produktionsåterförsök, timeout, loggning och failover-inställningar, använd produktionsbaslinjen istället för att utöka detta första urval.