Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
- Erstelle oder verbinde dich mit einer Datenbank, die die Beispieldaten
AdventureWorksLTenthält. Für Einrichtungsanweisungen für Azure SQL-Datenbank, SQL-Datenbanken in Microsoft Fabric, SQL Server und SQL Server-Containern siehe AdventureWorks-Beispieldatenbanken. - Bitten Sie den Datenbankadministrator, einen Datenbankbenutzer für Ihre Microsoft Entra-Identität zu erstellen.
- Unter Windows melden Sie sich mit dem Windows-Konto an, das Datenbankzugriff hat.
- Auf macOS oder Linux kann man ein Kerberos-Ticket für ein föderiertes Microsoft Entra-Konto erhalten. Für Anforderungen siehe Verwendung von Microsoft Entra ID mit dem ODBC-Treiber.
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.