Quickstart: Verbinden Sie sich mit den Microsoft-Treibern für PHP für SQL Server und fragen Sie sie ab

Verwenden Sie diese Schnellstartanleitung, um die PHP-Treiber zu installieren, mithilfe Ihrer Microsoft Entra-Identität eine Verbindung mit Azure SQL herzustellen und eine parametrisierte Transact-SQL-Abfrage (T-SQL) für die AdventureWorksLT Beispieldaten auszuführen. Wählen Sie entweder die SQLSRV-Prozedur-API oder die PDO_SQLSRV-API. Beide Stichproben lesen Verbindungseinstellungen aus Umweltvariablen ab und liefern dasselbe Ergebnis.

Die Abfrage liest Produktdaten und erstellt keine Datenbankobjekte.

Bevor du anfängst

1. PHP und die Treiber installieren

Wählen Sie Ihr Betriebssystem aus. Kopiere den gesamten Befehlsblock, füge ihn in das angegebene Terminal ein und führe ihn aus.

Öffnen Sie PowerShell als Administrator. Kopiere und führe diesen Block aus:

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

Die letzten drei Befehle zeigen die installierten PHP- und Erweiterungsversionen an. Schließen Sie das Administratorfenster, nachdem sie erfolgreich sind.

Wenn einer der Befehle php --ri meldet, dass die Erweiterung nicht vorhanden ist, gehe zuerst zur Fehlerbehebung der Installation , bevor du weitermachst.

2. Stellen Sie die Verbindungsinformationen ein

Ersetzen Sie <server> und <database> im Block für Ihr Betriebssystem. Kopiere und führe den gesamten Block im selben Terminal aus, das du auch für PHP verwenden wirst.

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

Important

Beide Beispiele ermöglichen die Verschlüsselung und validieren das Serverzertifikat. Wenn Ihr Server ein Zertifikat einer privaten Zertifizierungsstelle (CA) verwendet, installieren Sie die ausstellenden Root- und Zwischenzertifikate der CA im Vertrauensspeicher des Client-Betriebssystems. Legen Sie SQL_SERVER auf einen Namen im Feld Subject Alternative Name oder Common Name des Zertifikats fest. Andernfalls schlägt die Verbindung fehl, bevor die Abfrage ausgeführt wird. Weitere Informationen finden Sie unter Zertifikatskette nicht vertrauenswürdig und Konfigurieren der SQL Server-Verschlüsselung.

TrustServerCertificate=true Umgeht die Validierung der Serveridentität. Nutze es nur, um eine isolierte lokale Testumgebung zu diagnostizieren, nicht als Vertrauenskonfiguration für Produktions- oder geteilte Umgebungen.

3. Erstellen und ausführen Sie eine Probe

Wählen Sie eine PHP-API. Erstelle die benannte Datei, indem du den Code im ausgewählten Tab verwendest, und führe dann den Befehl nach dem Code aus.

Erstellen Sie quickstart-sqlsrv.php mit dem folgenden Code:

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

Führen Sie das Beispiel aus:

php quickstart-sqlsrv.php

4. Das Ergebnis überprüfen

Die Produktzeilen können je nach AdventureWorksLT-Version variieren. Beide Samples liefern Ausgaben, die diesem Beispiel ähneln:

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

Jede Probe prüft, ob die Abfrage fünf Produkte mit nichtleeren Namen und aufsteigenden Produkt-IDs zurückgegeben hat, bevor sie die Zeilen ausdruckt. Dann wird die Aussage freigegeben und die Verbindung geschlossen. Die Abfrage hinterlässt keine Datenbankobjekte oder Daten, die entfernt werden müssen.

Verwenden Sie eine andere Authentifizierungsmethode

Die Beispiele akzeptieren außerdem Managed Identity und SQL Server-Authentifizierung, ohne die PHP-Dateien zu ändern.

Verwaltete Identität

Für eine in Azure gehostete Anwendung aktivieren Sie eine verwaltete Identität und erstellen Sie deren Datenbankbenutzer. Stellen Sie Server, Datenbank und Authentifizierungsmodus in der Anwendungskonfiguration ein:

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

Legen Sie nicht fest SQL_USER oder SQL_PASSWORD.

Für SQL-Datenbanken in Microsoft Fabric gewähren Sie die Identität Read Item Permission über Fabric-Zugriffskontrollen. Verwenden Sie den SQL-Verbindungs-Endpunkt aus dem Datenbank-Element, nicht den SQL-Analytics-Endpunkt. Die SQL-Datenbank in Fabric unterstützt keine SQL-Authentifizierung.

SQL Server Authentifizierung

Verwenden Sie SQL Server-Authentifizierung nur für eine SQL Server-Instanz, die Sie kontrollieren, wie zum Beispiel einen isolierten lokalen Entwicklungscontainer. Bewahren Sie die Zugangsdaten in der Anwendungskonfiguration oder in einem geheimen Speicher auf. Verpflichte sie nicht zur Quellenkontrolle.

$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 andere Microsoft Entra-Authentifizierungsmethoden siehe Verbinden mit Microsoft Entra-Authentifizierung.

Installationsfehlerbehebung

Verwenden Sie diese Überprüfungen, wenn der Installationsblock stoppt oder ein Verifikationsbefehl fehlschlägt.

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

Wenn Get-Commandphp.exe nicht finden kann, schließe alle Terminalfenster, öffne ein neues PowerShell-Fenster und führe die Prüfungen erneut durch. Wenn ein php --ri-Befehl „Erweiterung nicht vorhanden“ meldet, führen Sie die PIE-Installationsbefehle von C:\php-quickstart erneut aus.

Wenn eine Verbindung FA001 anzeigt und angibt, dass die Authentifizierungsoption bei integrierter Sicherheit nicht verwendet werden kann, bestätigen Sie, dass SQL_AUTHENTICATION genau ActiveDirectoryIntegrated ist. Führe php --ri sqlsrv oder php --ri pdo_sqlsrv aus, um die Version des PHP-Treibers zu überprüfen, und aktualisiere den Treiber, wenn er älter als 5.10.1 ist.

Aufräumen

Die Proben veröffentlichen ihre Aussagen und schließen ihre Verbindungen. Sie erstellen keine Datenbankobjekte und speichern keine Daten.

Die Verbindungseinstellungen gelten für die aktuelle Terminalsitzung. Schließe das Terminal, wenn du fertig bist.

Verwenden Sie für Retry-, Timeout-, Logging- und Failover-Einstellungen in der Produktion die Produktionsbaseline, anstatt dieses Beispiels für die erste Ausführung zu erweitern.