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.
Die Microsoft Treiber für PHP für SQL Server umfassen zwei PHP-Erweiterungen, SQLSRV und PDO_SQLSRV. PDO_SQLSRV implementiert die PHP Data Objects (PDO)-Schnittstelle. Beide Erweiterungen verwenden den Microsoft ODBC-Treiber für SQL Server, um sich mit Microsoft SQL zu verbinden. Ihre PHP-APIs, treiberspezifischen Optionen und Standard-PHP-Typen unterscheiden sich. Zum Beispiel gibt SQLSRV standardmäßig Datums- und Zeitwerte als DateTime Objekte zurück, während PDO_SQLSRV standardmäßig Zeichenketten zurückgibt. Für Systemanforderungen siehe Systemanforderungen für die Microsoft-Treiber für PHP für SQL Server.
Wähle SQLSRV oder PDO_SQLSRV
| Wenn Sie... | Verwenden |
|---|---|
| Beginnen Sie ein neues Projekt ohne PDO-Code an anderer Stelle. | Wählen Sie die Benutzeroberfläche, die Ihre Anwendung durchgängig verwenden wird. SQLSRV stellt prozedurale Funktionen und explizite Parameterdeskriptoren offen. PDO_SQLSRV passt für Code, der um PDOStatement- und PDO-Objekte organisiert ist. |
| Ich nutze bereits PDO mit einer anderen Datenbank (MySQL, PostgreSQL, SQLite). | PDO_SQLSRV, damit Ihre Datenzugriffsschicht über alle Datenbanken hinweg konsistent bleibt. |
| Verwenden Sie ein Framework oder eine Bibliothek, die ein PDO-Verbindungsobjekt erwartet | PDO_SQLSRV. |
| Ich brauche manuelle, stückweise Kontrolle darüber, wann Streamdaten gesendet werden | SQLSRV, bei Verwendung von sqlsrv_send_stream_data(). PDO_SQLSRV streamt auch große Werte, indem es eine PHP-Stream-Ressource mit PDO::PARAM_LOBbindet, aber es sendet den gesamten Stream automatisch während execute() statt in vom Anrufer gesteuerten Chunks. |
Pflege eine Anwendung, die bereits sqlsrv_* Funktionen aufruft |
SQLSRV, es sei denn, du planst, den Datenzugriffscode für PDO umzuschreiben. |
Installiere entweder eine der Erweiterungen oder beide. Windows-Downloads enthalten separate Erweiterungsbinarien; auf Linux und macOS installieren Sie die sqlsrv und pdo_sqlsrv Pakete separat. Du kannst beide im selben PHP-Prozess laden. SQLSRV liefert Verbindungs- und Anweisungsressourcen; PDO_SQLSRV liefert PDOStatement- und PDO-Objekte zurück. Geben Sie keine Ressource von einer API zur anderen weiter.
Die Verwendung von PDO macht die Transact-SQL- (T-SQL-)Syntax nicht auf eine andere Datenbank übertragbar. PDO bietet dir eine gemeinsame PHP-Oberfläche; deine Abfragen, dein Schema, deine Authentifizierung und treiberspezifischen Attribute können weiterhin Microsoft SQL nutzen. Ebenso erfordert die Verwendung der prozeduralen Erweiterung keine prozedurale Organisation in deiner gesamten Anwendung: Du kannst SQLSRV aus deinen eigenen Klassen aufrufen.
Vergleichen Sie dasselbe Ergebnis in beiden APIs
Führen Sie diese Programme aus, bevor Sie die PHP-Repräsentation wählen, die Ihre Anwendung erwartet. Sie verwenden dieselbe Ganzzahl, dasselbe Datum und dieselbe SQL NULL, aber die Standardwerte sind nicht identisch. Keine Tabellen oder Beispieldatenbanken sind erforderlich.
Installiere und lade die ausgewählte Erweiterung. Legen Sie SQL_SERVER, SQL_DATABASE, SQL_USER und SQL_PASSWORD in der Prozessumgebung für eine bestehende SQL Server-Testdatenbank fest. Das Serverzertifikat muss vertrauenswürdig sein und mit dem konfigurierten Endpunkt übereinstimmen. Für Setup- und passwortlose Azure-Alternativen siehe Verbindung mit dem Server herstellen.
SQLSRV
Speichere dieses vollständige Programm als compare-sqlsrv.php, und führe php compare-sqlsrv.php aus.
<?php
$config = [];
foreach (['SQL_SERVER', 'SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$value = getenv($name);
if ($value === false || $value === '') {
throw new RuntimeException("Set $name before running this example.");
}
$config[$name] = $value;
}
foreach (['SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$config[$name] = '{' . str_replace('}', '}}', $config[$name]) . '}';
}
$conn = sqlsrv_connect($config['SQL_SERVER'], [
'Database' => $config['SQL_DATABASE'],
'UID' => $config['SQL_USER'],
'PWD' => $config['SQL_PASSWORD'],
'Encrypt' => true,
'TrustServerCertificate' => false,
'LoginTimeout' => 30,
'CharacterSet' => 'UTF-8',
]);
if ($conn === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$stmt = null;
try {
$stmt = sqlsrv_query($conn, "SELECT CAST(42 AS int) AS CountValue, "
. "CAST('2026-10-19' AS date) AS DayValue, CAST(NULL AS int) AS Missing");
if ($stmt === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
if ($row === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
if (!is_array($row) || $row['CountValue'] !== 42
|| !($row['DayValue'] instanceof DateTime)
|| $row['DayValue']->format('Y-m-d') !== '2026-10-19'
|| $row['Missing'] !== null) {
throw new RuntimeException('Unexpected SQLSRV values or default types.');
}
echo get_debug_type($row['CountValue']), ', ',
get_debug_type($row['DayValue']), ', ', get_debug_type($row['Missing']), PHP_EOL;
} finally {
if (is_resource($stmt)) {
sqlsrv_free_stmt($stmt);
}
sqlsrv_close($conn);
}
Erwartete Ausgabe:
int, DateTime, null
PDO_SQLSRV
Speichere dieses separate Programm als compare-pdo.php, und führe php compare-pdo.php aus. Es lässt absichtlich Zahlen- und Datumsabrufe auf ihren PDO_SQLSRV Defaults stehen.
<?php
$config = [];
foreach (['SQL_SERVER', 'SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$value = getenv($name);
if ($value === false || $value === '') {
throw new RuntimeException("Set $name before running this example.");
}
$config[$name] = $value;
}
foreach (['SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$config[$name] = '{' . str_replace('}', '}}', $config[$name]) . '}';
}
$server = $config['SQL_SERVER'];
$database = $config['SQL_DATABASE'];
$pdo = new PDO(
"sqlsrv:Server=$server;Database=$database;Encrypt=true;"
. "TrustServerCertificate=false;LoginTimeout=30",
$config['SQL_USER'],
$config['SQL_PASSWORD'],
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
]
);
$stmt = null;
try {
$stmt = $pdo->query("SELECT CAST(42 AS int) AS CountValue, "
. "CAST('2026-10-19' AS date) AS DayValue, CAST(NULL AS int) AS Missing");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row !== ['CountValue' => '42', 'DayValue' => '2026-10-19', 'Missing' => null]) {
throw new RuntimeException('Unexpected PDO_SQLSRV values or default types.');
}
echo get_debug_type($row['CountValue']), ', ',
get_debug_type($row['DayValue']), ', ', get_debug_type($row['Missing']), PHP_EOL;
} finally {
$stmt = null;
$pdo = null;
}
Erwartete Ausgabe:
string, string, null
Beide Programme fordern explizit benannte Ergebnisschlüssel an. Diese PHP-Arrays verwenden Spaltennamen wie CountValue, anstatt nullbasierter numerischer Indizes. Ein SQL NULL wird in jeder der beiden APIs zu PHP null. Es ist nicht der leere String oder eine fehlende Ergebniszeile.
Beide Programme lesen den tatsächlichen Datenbanknamen, Benutzernamen und Passwort aus der Umgebung aus. Sie maskieren diese Werte einmal für die ODBC-ähnliche Verbindungsbehandlung des PHP-Treibers. Das Verdoppeln von schließenden geschweiften Klammern und das Einschließen des Wertes in Klammern bewahrt die Sonderzeichen; es benennt die Datenbank nicht um und ändert das gespeicherte Passwort nicht. Für weitere Informationen siehe Verbinden mit dem Server.
Die Beispiele stoppen bei Fehlern und geben in finally Ressourcen frei. SQLSRV meldet Datenbankfehler über false und sqlsrv_errors(); PDO_SQLSRV löst bei Verbindungsfehlern Ausnahmen aus und verwendet Ausnahmen für Abfragefehler im konfigurierten Fehlermodus. Fangen Sie in einer Webanwendung diese Ausnahmen im Code ab, der die Anfrage verarbeitet. Erfassen Sie diagnostische Details in geschützten Protokollen, anstatt sie an einen Browser zurückzugeben.
Nach der Übung löschen Sie compare-sqlsrv.php und compare-pdo.php, falls Sie sie nicht mehr brauchen. Löschen Sie die Anmeldeinformations-Umgebungsvariablen aus dem Testprozess, wenn Sie fertig sind.
Wähle Typen, Codierung und Fehlerbehandlung
Entscheiden Sie, welche PHP-Typen Ihre Anwendung erwartet, wie sie mit Text und Fehlern umgeht und wann sie Datenbankressourcen freigibt.
| Entscheidung | SQLSRV | PDO_SQLSRV | Auswirkungen auf Anwendungscode |
|---|---|---|---|
| Ganzzahlige Ergebnistypen | Native PHP-Ganzzahlen für SQL-int-Spalten. | Standardmäßig Zeichenfolgen; PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE fordert unterstützte numerische PHP-Typen an. |
Strenge Vergleiche und serialisierte Ausgaben können unterschiedlich sein. Gehen Sie nicht davon aus, dass jeder SQL-Zahlentyp in eine PHP-Ganzzahl oder Gleitkommazahl passt. |
| Datum und Uhrzeit Ergebnisse |
DateTime wählt standardmäßig Objekte aus; ReturnDatesAsStrings wählt Strings aus. |
Strings standardmäßig; PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE wählt Objekte aus. |
Normalisiere die Darstellung vor der Serialisierung oder Weitergabe an Anwendungscode. |
| Zeichencodierung | Legen Sie CharacterSet => 'UTF-8' explizit fest. |
UTF-8 ist der Standard; konfigurieren Sie es mit PDO::SQLSRV_ATTR_ENCODING. |
Übertrage die SQLSRV-Option nicht in ein PDO-DSN. |
| Fehlerbehandlung | Überprüfen Sie false und erfassen Sie sofort die vollständige SQLSRV-Fehlersammlung. |
Konfigurieren Sie PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION. |
Eine fehlende Zeile und eine fehlgeschlagene Abfrage müssen unterschiedlich behandelt werden. |
| Parameterwiederverwendung | Binde Variablen durch Referenz in sqlsrv_prepare() Deskriptoren. |
Verwenden bindParam() Sie für eine Variable oder bindValue() für ihren aktuellen Wert. |
Die Neuzuweisung der Variablen wirkt sich auf eine Referenzbindung aus, nicht auf eine vorherige Wertbindung. |
| Cleanup | Freie Auszüge, dann schließen Sie die Verbindungsressource. | Verweisen Sie auf Release-Statement-Referenzen, dann auf das PDO-Objekt. | Eine Anweisung kann eine PDO-Verbindung lebendig halten, nachdem eine andere Referenz auf nullgesetzt wurde. |
Wenn Sie eine bestehende Anwendung migrieren, testen Sie diese Verhaltensweisen mit repräsentativen Werten, bevor Sie deren Datenbankcode ändern. Fügen Sie nicht-ASCII-Text, SQL NULL, Daten, exakte Dezimalwerte und gespeicherte Ausgabeparameter ein. Vergleiche auch, wie dein Framework PDO-Attribute konfiguriert. Das bloße Ersetzen von Funktionsnamen migriert keine Fehlerbehandlung, Referenzbindung oder zurückgegebene PHP-Typen.
Für einen ausgearbeiteten Schreib- und Lese-Workflow mit beiden APIs verwenden Sie die Programmieranleitung. Für wiederholte Ausführung und typisierte Eingaben verwenden Sie die Ausführungsfunktionen Compare Query.
Wissen Sie, was jede Komponente bewirkt
Deine Erweiterungswahl verändert die PHP-API und deren Typkonvertierungen. Beide Erweiterungen nutzen ODBC, um mit dem Server zu kommunizieren, Verbindungen zu verschlüsseln und sich zu authentifizieren. Das Betriebssystem stellt vertrauenswürdige Zertifikate und Dienste wie Windows-Authentifizierung oder Kerberos bereit. Das SQL-Ziel steuert Berechtigungen, Schemata und unterstützte T-SQL-Anweisungen.
Die Vergleichsprogramme verwenden SQL-Authentifizierung für SQL Server. Für Azure SQL-Datenbank, Azure SQL Managed Instance, Azure Synapse Analytics, SQL Database in Fabric oder Warehouse in Fabric konfigurieren Sie den Service-Endpunkt und die unterstützte Authentifizierung, bevor Sie das Fetch-Muster wiederverwenden. Beide Fabric-Produkte erfordern eine Microsoft Entra ID-Authentifizierung; Warehouse erfordert außerdem das Deaktivieren mehrerer aktiver Ergebnissets (MARS). Ein erfolgreicher Typvergleich auf SQL Server bedeutet nicht, dass ein anderes Ziel jede in dieser Übersicht aufgeführte Funktion unterstützt.
Was beide Erweiterungen bieten
- Integrierte Authentifizierung, SQL-Authentifizierung und Microsoft Entra ID-Authentifizierung, abhängig von der Unterstützung des Ziels. Die verwaltete Identität verwendet kein Anwendungspasswort;
ActiveDirectoryServicePrincipalverwendet eine Client-ID und ein Client-Geheimnis. Für weitere Informationen siehe Verbinden mit dem Server. - Parametrisierte Abfragen, Prepared Statements und Eingabe-/Ausgabeparameter. Weitere Informationen finden Sie unter Vergleich von Ausführungsfunktionen und Verwendung von Richtungsparametern.
- Transaktionen, Stromeingabeparameter für große Zeichen und Binärwerte sowie tabellenwertige Parameter.
- Always Encrypted, einschließlich sicherer Enklaven, in denen der ODBC-Treiber und der SQL Server sie unterstützen. Weitere Informationen finden Sie unter Verwendung von Always Encrypted mit den Microsoft-Treibern für PHP für SQL Server.
- Verbindungen zu SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance, Azure Synapse Analytics, SQL Database in Microsoft Fabric und Warehouse in Microsoft Fabric. Authentifizierungs- und SQL-Funktionen variieren je nach Ziel; siehe Azure- und Fabric-Verbindungen.
Verwandte Inhalte
- Veröffentlichungshinweise für die Microsoft-Treiber für PHP für SQL Server
- Support-Ressourcen für die Microsoft-Treiber für PHP für SQL Server
- Über Codebeispiele in der Dokumentation
- SQLSRV-Treiber-API-Referenz
- PDO_SQLSRV Treiberreferenz
- Konstanten (Microsoft-Treiber für PHP für SQL Server)
- Einstieg mit den Microsoft-Treibern für PHP für SQL Server
- Programmieranleitung für die Microsoft-Treiber für PHP für SQL Server
- Beispielanwendung (SQLSRV-Treiber)