Microsoft-stuurprogramma's voor PHP voor SQL Server

PHP-stuurprogramma downloaden

De Microsoft Drivers voor PHP voor SQL Server zijn PHP-extensies die je kunt gebruiken om data te lezen en te schrijven in de Microsoft SQL Database Engine vanuit PHP-scripts. De twee extensies gebruiken dezelfde Microsoft ODBC-driver voor SQL Server, maar bieden verschillende PHP-API's en driver-specifieke opties:

  • SQLSRV biedt een procedurele API (sqlsrv_*functies) die is afgestemd op SQL Server-functies.
  • PDO_SQLSRV implementeert de PHP Data Objects (PDO) -interface. Je kunt de PDO-aanroepen in bestaande databasecode houden, maar bekijk de query's en driverspecifieke instellingen voordat je overstapt naar een andere database.

Beide drivers verbinden met Azure SQL Database, SQL-database in Microsoft Fabric, Azure SQL Managed Instance en alle ondersteunde versies en edities van SQL Server, inclusief Express-edities. Beide stuurprogramma's accepteren PHP-streams als invoerparameter. SQLSRV ondersteunt het ophalen van grote binaire en tekenwaarden als streams. Ga er niet van uit dat PDO_SQLSRV hetzelfde output-streaming gedrag vertoont.

Uw beginpunt kiezen

Productiebasislijn voor Azure SQL

Dit PDO_SQLSRV voorbeeld leest de server en database uit omgevingsvariabelen en maakt verbinding met een beheerde identiteit. Het bouwt een databronnaam (DSN) en maakt Transport Layer Security (TLS) mogelijk met certificaatvalidatie. Lees deze waarden uit de vertrouwde applicatieconfiguratie, niet uit webverzoekparameters. Voer het programma uit op een host met een managed identity-eindpunt nadat de identiteit toegang tot de database heeft gekregen.

De hulpfuncties maken tot drie pogingen om verbinding te maken of de alleen-lezenquery uit te voeren wanneer een vermelde fout optreedt. Ze wachten langer tussen pogingen, een herpogingspatroon dat exponentiële backoff wordt genoemd. Als een queryfout een nieuwe verbinding vereist, gooit de queryhelper de uitzondering zodat de aanroepende code deze kan afhandelen.

Gebruik een ondersteunde PHP-versie, de PDO_SQLSRV-extensie en Microsoft ODBC Driver 18 voor SQL Server. Voor ondersteunde authenticatiewaarden raadpleegt u Verbinding maken met Microsoft Entra-authenticatie. Gebruik de queryhelper niet opnieuw voor writes of multistatement-transacties zonder een applicatie-specifiek retry-beleid te ontwerpen: een fout vertelt je niet altijd of een write is committed.

<?php
declare(strict_types=1);

// Transient errors that require a fresh connection to recover. SQLSTATE values
// starting with '08' cover ODBC connection-established and connection-broken
// states (for example, 08001, 08S01).
const CONNECT_RETRY_SQLSTATE_PREFIX = '08';

// SQL Server error codes that are transient regardless of when they surface:
// 1205 (deadlock victim), 1222 (lock request timeout), and the Azure SQL
// throttling, mid-query failover, and "database not currently available"
// codes that arrive with SQLSTATE HY000.
const TRANSIENT_SERVER_ERROR_CODES = [1205, 1222, 40501, 40613, 40197, 10928, 10929, 49918];

// This read helper retries only the listed errors on the same connection.
// Other errors propagate; the caller must decide whether to reconnect.
const RETRYABLE_READ_ERROR_CODES = [1205, 1222, 40501, 10928, 10929];

/**
 * Open a connection, retrying transient failures with exponential backoff.
 */
function connectWithRetry(string $dsn, array $options, int $maxAttempts = 3): PDO
{
    for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
        try {
            $pdo = new PDO($dsn, null, null, $options);
            error_log(sprintf('connected on attempt %d/%d', $attempt, $maxAttempts));
            return $pdo;
        } catch (PDOException $e) {
            $sqlstate = (string) $e->getCode();
            $driverCode = isset($e->errorInfo[1]) ? (int) $e->errorInfo[1] : 0;
            $isTransient = str_starts_with($sqlstate, CONNECT_RETRY_SQLSTATE_PREFIX)
                || in_array($driverCode, TRANSIENT_SERVER_ERROR_CODES, true);
            if (!$isTransient || $attempt === $maxAttempts) {
                error_log(sprintf('connect failed on attempt %d/%d: %s', $attempt, $maxAttempts, $e->getMessage()));
                throw $e;
            }
            $delay = 2 ** ($attempt - 1);
            error_log(sprintf('connect attempt %d hit transient %s/%d; retrying in %d seconds', $attempt, $sqlstate, $driverCode, $delay));
            sleep($delay);
        }
    }
    throw new RuntimeException('connectWithRetry exhausted retries');
}

/**
 * Retry the standalone read-only query for errors that allow connection reuse.
 */
function queryWithRetry(PDO $pdo, string $sql, array $params = [], int $maxAttempts = 3): PDOStatement
{
    for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
        try {
            $stmt = $pdo->prepare($sql);
            $stmt->execute($params);
            return $stmt;
        } catch (PDOException $e) {
            $driverCode = isset($e->errorInfo[1]) ? (int) $e->errorInfo[1] : 0;
            $isTransient = in_array($driverCode, RETRYABLE_READ_ERROR_CODES, true);
            if (!$isTransient || $attempt === $maxAttempts) {
                error_log(sprintf('query failed on attempt %d/%d: %s', $attempt, $maxAttempts, $e->getMessage()));
                throw $e;
            }
            $delay = 2 ** ($attempt - 1);
            error_log(sprintf('query attempt %d hit transient code %d; retrying in %d seconds', $attempt, $driverCode, $delay));
            sleep($delay);
        }
    }
    throw new RuntimeException('queryWithRetry exhausted retries');
}

// Load endpoint details from application configuration. In Azure App Service,
// these can come from app settings or Key Vault-backed settings.
$server = getenv('SQL_SERVER') ?: null;
$database = getenv('SQL_DATABASE') ?: null;

if ($server === null || $database === null) {
    throw new RuntimeException('Set SQL_SERVER and SQL_DATABASE in your application configuration.');
}
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';

$dsn = sprintf(
    'sqlsrv:Driver={ODBC Driver 18 for SQL Server};Server=%s;Database=%s;'
    . 'Encrypt=true;TrustServerCertificate=false;'
    . 'LoginTimeout=90;Authentication=ActiveDirectoryMsi;'
    . 'ConnectRetryCount=5;ConnectRetryInterval=15;'
    . 'MultiSubnetFailover=true;',
    $server,
    $databaseValue
);

$options = [
    PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES      => false,
    PDO::SQLSRV_ATTR_QUERY_TIMEOUT  => 30,
];

$pdo = connectWithRetry($dsn, $options);
$stmt = queryWithRetry($pdo, 'SELECT name FROM sys.databases WHERE database_id > ? ORDER BY name', [1]);
foreach ($stmt as $row) {
    echo $row['name'], PHP_EOL;
}

Gebruik deze instellingen voor Azure SQL Database failover-groepen en Azure SQL Managed Instance.

  • Driver={ODBC Driver 18 for SQL Server} selecteert ODBC Driver 18 expliciet in plaats van te vertrouwen op driverontdekking. Installeer het voordat je het voorbeeld uitvoert.

  • Stel SQL_DATABASE in op de daadwerkelijke databasenaam. Het programma verdubbelt sluitaccolades en plaatst de naam tussen accolades voordat deze in de DSN wordt geplaatst. Escaping voorkomt dat speciale tekens in de naam van invloed zijn op hoe de driver de verbindingsinstellingen leest.

  • ConnectRetryCount en ConnectRetryInterval regelen de tolerantie van inactieve ODBC-verbindingen voor storingen. De querytime-out van de instructie begrenst herstel tijdens de uitvoering. Met de 30 seconden durende query-time-out van het voorbeeld kan ODBC stoppen voordat alle vijf herverbindingspogingen zijn uitgeput. LoginTimeout=90 regelt het tot stand brengen van de verbinding, niet het herstelbudget. De helper op applicatieniveau probeert geselecteerde serverfouten opnieuw; hij probeert een querytimeout niet opnieuw en verwerkt gedeeltelijk opgehaalde resultaten niet opnieuw.

  • Schakel driverlogging in samen met de aanroepen error_log() van het programma. Voor PDO_SQLSRV stel pdo_sqlsrv.log_severity in in php.ini of met ini_set() tijdens runtime. Voor SQLSRV configureer LogSeverity en LogSubsystems met sqlsrv_configure(). Voor meer informatie, zie Logboekactiviteit.

    ; php.ini - enable PDO_SQLSRV driver diagnostics alongside the application-level
    ; error_log() calls in the sample. Use 1 (errors) in production; -1 (all) is
    ; useful during triage but very chatty.
    [pdo_sqlsrv]
    pdo_sqlsrv.log_severity = 1
    
  • Voor een door de gebruiker toegewezen beheerde identiteit geef je de ID van de identiteit door als het $username argument van PDO (new PDO($dsn, $identityId, null, $options)). Gebruik de client ID van de identiteit op Azure App Service of Azure Container Instance; anders gebruik je de object-ID. De PHP-drivers erven dit gedrag van de onderliggende Microsoft ODBC Driver for SQL Server; voor meer informatie, zie Gebruik van Microsoft Entra ID met de ODBC Driver. Gebruik het gebruikersnaamargument van de PDO-constructor in plaats van de gebruikersnaam in het DSN in te bedden. Door null als gebruiker op te geven (zoals in het voorbeeld), selecteer je de door het systeem toegewezen beheerde identiteit van de Azure-host. Voor SQLSRV (procedureel) geef je UID door in de array met verbindingsopties.

  • Stel MultiSubnetFailover=true in wanneer je verbinding maakt met een listener van een failovergroep, listener van een beschikbaarheidsgroep of eindpunt van een failoverclusterexemplaar. Door dit in te stellen verbeteren de verbindingsprestaties voor listeners van beschikbaarheidsgroepen met zowel één subnet als meerdere subnetten. Voor meer informatie, zie Support for High Availability, disaster recovery.

  • Voor read scale-out of een leesbare secundaire versie, voeg ApplicationIntent=ReadOnly toe aan de DSN.

  • Gebruik het endpoint dat door je SQL-service wordt geleverd, inclusief het cloud-specifieke domein. Onderzoek afwijkingen tussen certificaatnamen in plaats van certificaatvalidatie uit te schakelen. Gebruik HostNameInCertificate alleen wanneer je de verwachte certificaatnaam voor dat eindpunt kent.

  • ODBC verwerft tokens voor beheerde identiteit en service principal-authenticatie. Met AccessToken verkrijgt uw applicatie het token en geeft dit door aan het stuurprogramma; ODBC verkrijgt het niet voor u. Zie Microsoft Entra-id gebruiken met het ODBC-stuurprogrammavoor meer informatie.

  • Houd de verbindingsinformatie buiten je code. Sla het op in het configuratiesysteem van je applicatie en gebruik Azure Key Vault voor geheimen.

  • Met SQLSRV stel je verbindingsopties in de array die aan sqlsrv_connect()wordt doorgegeven. Controleer of je een retourwaarde van false hebt en inspecteer sqlsrv_errors() voordat je beslist of je het opnieuw probeert. Stel statement-time-outs afzonderlijk in met QueryTimeout. Veerkracht van inactieve verbindingen demonstreert ODBC-herverbinding, niet een retrylus op applicatieniveau.

  • De retry-helpers lezen $e->errorInfo[1], beveiligd door isset(). PDOException::$errorInfo is gedeclareerd als ?array en heeft standaardwaarde null, dus de defensieve controle grijpt terug op een drivercode van 0 en laat het voorvoegsel 08 van SQLSTATE bepalen of er opnieuw wordt geprobeerd.

Zie voor meer informatie over elk onderdeel van deze configuratie:

Zie Tijdelijke verbindingsfouten oplossen voor de catalogus met Azure SQL tijdelijke fouten.

Belangrijkste kenmerken

  • Twee PHP-API's: SQLSRV biedt procedurele functies. PDO_SQLSRV implementeert PDO. Installeer één extensie of beide.
  • Ondersteuning voor brede platforms: Draait op Windows, Linux en macOS met ondersteunde PHP-versies.
  • Versleutelde verbindingen: TLS-versleutelde verbindingen via Encrypt=true, waarbij de validatie van servercertificaten wordt gecontroleerd door TrustServerCertificate.
  • Microsoft Entra ID-authenticatie: Beheerde identiteit, service principal en extern verkregen toegangstokens via de onderliggende Microsoft ODBC-driver voor SQL Server. Managed Identity is wachtwoordloos; ActiveDirectoryServicePrincipal gebruikt een client secret.
  • Always Encrypted: Versleutel gevoelige kolommen op de client, met veilige enclaves voor ondersteunde bewerkingen op versleutelde data.
  • Verbindingsveerkracht: Ingebouwde idle verbindingen proberen opnieuw met ConnectRetryCount en ConnectRetryInterval.
  • PHP-stromen: Stuur grote binaire en tekenwaarden van stroomparameters met een van beide API's. Gebruik SQLSRV voor gestreamde retrieval.
  • Ondersteuning voor Rich SQL Server datatypes: datetimeoffset, tabelwaardige parameters, nvarchar en Unicode met PDO::SQLSRV_ENCODING_UTF8.

Get started

Artikel Description
Systeemvereisten Ondersteunde PHP-, besturingssysteem- en SQL Server-versies.
Ondersteuningsmatrix Gedetailleerde compatibiliteitsmatrix voor PHP-driverreleases.
Download de Microsoft-drivers voor PHP voor SQL Server Download links en vrijgave artefacten.
Installatiehandleiding voor Linux en macOS Installeer de driver en de ODBC-vereisten op Linux en macOS.
Stuurprogramma's laden Schakel de extensies in php.ini.
Quickstart: Verbind en zoek de Microsoft Drivers voor PHP Controleer de extensies, configureer een verbinding en voer dezelfde geparametriseerde query uit met SQLSRV of PDO_SQLSRV.
Overzicht van de PHP SQL-driver Wat zit er in het pakket, en wanneer je SQLSRV of PDO_SQLSRV moet kiezen.

Configureren en verbinding maken

Artikel Description
Verbinding maken met de server Open een verbinding met een SQL Server-instantie vanuit PHP.
Verbindingsopties Volledige referentie voor verbindingszoekwoorden, standaardwaarden en hoe je die instelt.
Verbinding maken met Microsoft Azure SQL Database Verbind een PHP-applicatie met Azure SQL Database.
Verbind op een gespecificeerde poort Richt je op een niet-standaard TCP-poort.
Groepsgewijze verbindingen Hergebruik ODBC-verbindingen over PHP-verzoeken heen.
Schakel meerdere actieve resultaatsets uit (MARS) Zet MARS uit voor compatibiliteit.
Ondersteuning voor LocalDB Maak verbinding met een SQL Server LocalDB-instantie.
Ondersteuning voor hoge beschikbaarheid, rampenherstel Listeners voor beschikbaarheidsgroepen en failover met meerdere subnetten.
Idle verbindingsveerkracht Automatische herverbinding bij verbroken idle verbindingen.

Authenticate

Artikel Description
Verbinding maken door gebruik te maken van Microsoft Entra-verificatie Beheerde identiteit, dienstprincipal, toegangstoken en wachtwoordstromen.
Verbind met SQL Server-authenticatie Gebruik een SQL-login met een gebruikersnaam en wachtwoord.
Maak verbinding met Windows authentication Gebruik geïntegreerde authenticatie op Windows of Kerberos op Linux en macOS.

Secure

Artikel Description
Beveiligingsoverwegingen Richtlijnen voor het dreigingsmodel en gelaagde verdediging voor PHP-toepassingen.
Altijd versleuteld met de PHP-drivers Configureer versleuteling aan de clientzijde voor gevoelige kolommen.
Always Encrypted met beveiligde enclaves Maak uitgebreide bewerkingen op versleutelde kolommen mogelijk met veilige enclaves.

Gegevens ophalen en bijwerken

Artikel Description
Programmeergids Zoek programmeertaken voor beide stuurprogramma's.
Uitvoeringsfuncties vergelijken Kies de juiste uitvoeringsfunctie voor jouw werkdruk.
Directe en voorbereide instructie-uitvoering (PDO_SQLSRV) Wanneer gebruik je directe uitvoering in plaats van prepared statements.
Data ophalen Haal rijen, kolommen en streamingwaarden op.
Gegevens bijwerken Rijen invoegen, updaten en verwijderen.
Voer geparametriseerde queries uit Bind parameters om SQL-injectie te voorkomen.
Gegevens verzenden als gegevensstroom Grote binaire en tekenreekswaarden streamen naar SQL Server.
Transacties uitvoeren Commit of draai een groep instructies samen terug.
Gebruik tabelwaardenparameters Geef een TABLE parameter door aan een opgeslagen procedure.
Specificeer een cursortype en selecteer rijen Kies alleen vooruit-, statische, dynamische of keyset-cursors.

Gegevenstypen

Artikel Description
Omzetten van datatypen Hoe de driver PHP-types koppelt aan SQL Server-types.
Standaard SQL Server datatypes Standaard SQL Server-type voor elke PHP-waarde.
Standaard PHP-datatypes Standaard PHP-type voor elk kolomtype van SQL Server.
Specificeer SQL Server-datatypes (SQLSRV) Overschrijven van het SQL Server-type bij het koppelen van parameters.
Specificeer PHP-datatypes Overschrijf het PHP-type bij het ophalen.
Verzenden en ophalen UTF-8 gegevens Stel de CharacterSet optie van SQLSRV of het PDO::SQLSRV_ATTR_ENCODING-attribuut van PDO_SQLSRV in.
ASCII-gegevens verzenden en ophalen op Linux en macOS Verwerk ASCII-retourconversies op hosts die geen Windows gebruiken.
Formateer decimalen en geld (SQLSRV) Decimal- en moneykolommen opmaken met de SQLSRV-driver.
Decimale getallen en geld opmaken (PDO_SQLSRV) Formateer kolommen van het type decimal en money met de PDO_SQLSRV-driver.
Niet-systeemlocatie-instellingen Gelokaliseerde decimale scheiders en andere lokale overwegingen.

Fouten en diagnostieken

Artikel Description
Afhandelingsfouten en waarschuwingen Fout- en waarschuwingsverwerking met beide stuurprogramma's.
Configuratie van fout- en waarschuwingsbehandeling (SQLSRV) Stel af hoe de SQLSRV-driver fouten en waarschuwingen rapporteert.
Omgaan met fouten en waarschuwingen (SQLSRV) Inspecteer fouten die door SQLSRV-functies worden teruggegeven.
Registratieactiviteit Schakel logboekregistratie van het stuurprogramma in om diagnostische gegevens vast te leggen.

Implementeren en gebruiken

Artikel Description
Performance-optimalisatie Verbindingsbeheer, batching, voorbereide instructies, cursors, geheugen en server-side monitoring.
Troubleshooting Diagnoseer veelvoorkomende problemen met installaties, verbindingen, querys, datatypes, transacties en containers.

Referentiemateriaal

Artikel Description
SQLSRV-driver API-referentie Alle sqlsrv_* functies, parameters en retourwaarden.
Naslagwerk voor het PDO_SQLSRV-stuurprogramma PDO- en PDOStatement-methoden die worden ondersteund door de PDO_SQLSRV driver.
Constanten Constanten die door de drivers worden blootgelegd, inclusief type- en coderingsconstanten.
Artikel Description
Opmerkingen bij de release Per-versiegeschiedenis met nieuwe functies, bugfixes, wijzigingen in platformondersteuning en downloadlinks.
Over codevoorbeelden in de documentatie Conventies die in de codevoorbeelden in deze sectie worden gebruikt.
Codevoorbeelden voor de PHP SQL-driver End-to-end voorbeeldapplicaties voor SQLSRV en PDO_SQLSRV.
Ondersteunende bronnen Community en ondersteuningskanalen.

Verzoeken om een functie toe te voegen

Om een functie aan te vragen, open je een issue in de Microsoft Drivers for PHP voor SQL Server GitHub repository.