Overzicht van de Microsoft-stuurprogramma's voor PHP voor SQL Server

PHP-stuurprogramma downloaden

De Microsoft drivers voor PHP voor SQL Server omvatten twee PHP-extensies, SQLSRV en PDO_SQLSRV. PDO_SQLSRV implementeert de PHP Data Objects (PDO)-interface. Beide extensies gebruiken de Microsoft ODBC Driver voor SQL Server om verbinding te maken met Microsoft SQL. Hun PHP-API's, driver-specifieke opties en standaard PHP-types verschillen. Bijvoorbeeld, SQLSRV geeft standaard datum- en tijdwaarden als DateTime objecten terug, terwijl PDO_SQLSRV standaard tekenreeksen teruggeeft. Voor systeemvereisten, zie Systeemvereisten voor de Microsoft Drivers voor PHP voor SQL Server.

Kies SQLSRV of PDO_SQLSRV

Als u... Gebruiken
Begin je een nieuw project zonder elders PDO-code? Kies de interface die je applicatie consequent zal gebruiken. SQLSRV biedt procedurele functies en expliciete parameterdescriptors. PDO_SQLSRV past bij code die rondom PDO objecten en PDOStatement objecten is georganiseerd.
Ik gebruik al PDO met een andere database (MySQL, PostgreSQL, SQLite). PDO_SQLSRV, zodat je data-toegangslaag consistent blijft over databases.
Gebruik een framework of bibliotheek die een PDO-verbindingsobject verwacht PDO_SQLSRV.
Handmatige, chunk voor chunk controle nodig over wanneer streamdata wordt verzonden SQLSRV, met gebruik van sqlsrv_send_stream_data(). PDO_SQLSRV streamt ook grote waarden door een PHP-stroomresource te binden met PDO::PARAM_LOB, maar stuurt de hele stroom automatisch tijdens execute() in plaats van in door de caller gecontroleerde chunks.
Onderhoud een applicatie die al sqlsrv_* functies aanroept SQLSRV, tenzij je van plan bent de data-toegangscode voor PDO te herschrijven.

Installeer een van beide extensies of allebei. Windows-downloads bevatten aparte extensiebinairen; op Linux en macOS installeer je de sqlsrv en pdo_sqlsrv packages apart. Je kunt beide in hetzelfde PHP-proces laden. SQLSRV levert verbindings- en statementresources terug; PDO_SQLSRV levert PDOStatement- en PDO-objecten terug. Geef geen resource door van de ene API naar de andere.

Het gebruik van PDO maakt Transact-SQL (T-SQL) syntax niet draagbaar naar een andere database. PDO geeft je een gemeenschappelijke PHP-interface; je queries, schema, authenticatie en driver-specifieke attributen kunnen nog steeds Microsoft SQL-specifiek zijn. Evenzo vereist het gebruik van de procedurele extensie geen procedurele organisatie in je applicatie: je kunt SQLSRV aanroepen vanuit je eigen klassen.

Vergelijk hetzelfde resultaat in beide API's

Voer deze programma's uit voordat je de PHP-representatie kiest die je applicatie verwacht. Ze selecteren hetzelfde gehele getal, datum en SQL NULL, maar de standaardinstellingen zijn niet identiek. Er zijn geen tabellen of voorbeelddatabase nodig.

Installeer en laad de geselecteerde extensie. Stel SQL_SERVER, SQL_DATABASE, SQL_USER, en SQL_PASSWORD in in de procesomgeving voor een bestaande SQL Server testdatabase. Het servercertificaat moet worden vertrouwd en overeenkomen met het geconfigureerde eindpunt. Voor setup- en wachtwoordloze Azure-alternatieven, zie Verbinden met de server.

SQLSRV

Sla dit volledige programma op als compare-sqlsrv.php, en voer php compare-sqlsrv.php. uit

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

Verwachte uitvoer:

int, DateTime, null

PDO_SQLSRV

Sla dit aparte programma op als compare-pdo.php, en voer php compare-pdo.php uit. Het laat opzettelijk numeriek en datum-ophalen op de standaardinstellingen van PDO_SQLSRV.

<?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;
}

Verwachte uitvoer:

string, string, null

Beide programma's vragen expliciet om benoemde resultaatsleutels. Deze PHP-arrays gebruiken kolomnamen zoals CountValue, in plaats van nul-gebaseerde numerieke indexen. Een SQL NULL wordt PHP null in beide API's. Het is niet de lege string of een ontbrekende resultaatrij.

Beide programma's lezen de daadwerkelijke databasenaam, gebruikersnaam en wachtwoord uit de omgeving. Ze escapen deze waarden één keer voor de ODBC-achtige verbindingsafhandeling van de PHP-driver. Het verdubbelen van sluitende accoladen en het plaatsen van de waarde tussen accoladen behoudt speciale tekens; het hernoemt de database niet en verandert het opgeslagen wachtwoord niet. Voor meer informatie, zie Verbinden met de server.

De voorbeelden stoppen bij fouten en geven resources vrij in finally. SQLSRV rapporteert databasefouten via false en sqlsrv_errors(); PDO_SQLSRV throws voor verbindingsfouten en gebruikt uitzonderingen voor queryfouten met de geconfigureerde foutmodus. In een webapplicatie vang je deze uitzonderingen in de code die het verzoek afhandelt. Registreer diagnostische gegevens in beschermde logboeken in plaats van ze terug te sturen naar een browser.

Verwijder compare-sqlsrv.php na de oefening en compare-pdo.php als je ze niet meer nodig hebt. Verwijder de omgevingsvariabelen voor inloggegevens uit het testproces als je klaar bent.

Kies types, codering en foutafhandeling

Bepaal welke PHP-typen je applicatie verwacht, hoe deze omgaat met tekst en fouten, en wanneer je applicatie databaseresources vrijgeeft.

Besluit SQLSRV PDO_SQLSRV Effect op de applicatiecode
Typen integerresultaten Native PHP-integers voor SQL int-kolommen. Strings standaard; PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE verzoeken ondersteunde numerieke PHP-types. Strikte vergelijkingen en geserialiseerde output kunnen verschillen. Ga er niet van uit dat elk SQL-numeriek type in een PHP-integer of float past.
Datum- en tijdresultaten DateTime selecteert standaard objecten; ReturnDatesAsStrings selecteert strings. Standaard strings; PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE selecteert objecten. Normaliseer de representatie voordat je deze serialiseert of doorgeeft aan applicatiecode.
Tekencodering Stel CharacterSet => 'UTF-8' expliciet in. UTF-8 is de standaard; configureer het met PDO::SQLSRV_ATTR_ENCODING. Zet de SQLSRV-optie niet over in een PDO DSN.
Foutafhandeling Controleer false en registreer onmiddellijk de volledige SQLSRV-foutverzameling. De configuratie van PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION. Een ontbrekende rij en een mislukte query vereisen verschillende behandeling.
Hergebruik van parameters Koppel variabelen door verwijzing in sqlsrv_prepare()-descriptoren. Gebruik bindParam() voor een variabele of bindValue() voor de huidige waarde ervan. Het opnieuw toewijzen van de variabele beïnvloedt een referentiebinding, niet een eerdere waardebinding.
Cleanup Geef statements vrij en sluit daarna de verbindingsresource. Release statement-referenties, daarna het PDO-object. Een statement kan een PDO-verbinding levend houden nadat een andere referentie is ingesteld op null.

Als je een bestaande applicatie migreert, test dan deze gedragingen met representatieve waarden voordat je de databasecode verandert. Neem niet-ASCII-tekst, SQL NULL, datums, exacte decimale waarden en opgeslagen-procedure outputparameters op. Vergelijk ook hoe jouw framework PDO-attributen configureert. Het vervangen van functienamen alleen migreert geen foutafhandeling, referentiebinding of teruggegeven PHP-typen.

Voor een uitgewerkte schrijf-en-lees-workflow met beide API's, gebruik de programmeergids. Voor herhaalde uitvoering en getypeerde invoer gebruik je Compare query execution functions.

Weet wat elk onderdeel doet

Je keuze voor extensie verandert de PHP API en de typeconversies. Beide extensies gebruiken ODBC om met de server te communiceren, verbindingen te versleutelen en zich te authenticeren. Het besturingssysteem levert vertrouwde certificaten en diensten zoals Windows authentication of Kerberos. Het SQL-doel beheert permissies, schema's en ondersteunde T-SQL-instructies.

De vergelijkingsprogramma's gebruiken SQL-authenticatie voor SQL Server. Voor Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL Database in Fabric of Warehouse in Fabric, configureer je het service-endpoint en ondersteunde authenticatie voordat je het fetch-patroon hergebruikt. Beide Fabric-producten vereisen Microsoft Entra ID-authenticatie; Warehouse vereist ook het uitschakelen van meerdere actieve resultaatsets (MARS). Een succesvolle typevergelijking op SQL Server bewijst niet dat een ander doel elke functie in dit overzicht ondersteunt.

Wat beide uitbreidingen bieden

  • Geïntegreerde verificatie, SQL-verificatie en Microsoft Entra ID-verificatie, afhankelijk van de ondersteuning van het doel. Managed identity gebruikt geen applicatiewachtwoord; ActiveDirectoryServicePrincipal gebruikt een client-ID en client secret. Voor meer informatie, zie Verbinden met de server.
  • Geparametriseerde queries, voorbereide statements en directionele (input/output) parameters. Voor meer informatie, zie Uitvoeringsfuncties vergelijken en Directional parameters gebruiken.
  • Transacties, stroominvoerparameters voor grote teken- en binaire waarden, en tabelwaardige parameters.
  • Altijd versleuteld, inclusief beveiligde enclaves waar de ODBC-driver en SQL Server target ze ondersteunen. Voor meer informatie, zie Gebruik Altijd Versleuteld met de Microsoft Drivers voor PHP voor SQL Server.
  • Verbindingen met SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL database in Microsoft Fabric en Warehouse in Microsoft Fabric. Authenticatie- en SQL-functies verschillen per doelomgeving; zie Azure- en Fabric-verbindingen.