Microsoft-drivrutiner för PHP för SQL Server

Ladda ned PHP-drivrutin

Microsoft-drivrutiner för PHP för SQL Server är PHP-tillägg som du kan använda för att läsa och skriva data i Microsoft SQL Database Engine med PHP-skript. De två tilläggen använder samma Microsoft ODBC-drivrutin för SQL Server, men de erbjuder olika PHP-API:er och drivrutinsspecifika alternativ:

  • SQLSRV exponerar ett prozedurmässigt API (sqlsrv_*funktioner) anpassat till SQL Server-funktioner.
  • PDO_SQLSRV implementerar PHP Data Objects (PDO) -gränssnittet. Du kan behålla PDO-anropen i befintlig databaskod, men granska dess frågesatser och drivrutinsspecifika inställningar innan du byter databas.

Båda drivrutinerna ansluter till Azure SQL Database, SQL-databas i Microsoft Fabric, Azure SQL Managed Instance och alla stödda versioner och utgåvor av SQL Server, inklusive Express-versioner. Båda drivrutinerna accepterar PHP-strömmar som indataparametrar. SQLSRV stödjer att hämta stora binära värden och teckenvärden som strömmar. Anta inte att PDO_SQLSRV uppvisar samma output-streamingbeteende.

Välj startpunkt

Produktionsbaslinje för Azure SQL

Detta PDO_SQLSRV-exempel läser servern och databasen från miljövariabler och ansluter med hjälp av en hanterad identitet. Den bygger ett datakällnamn (DSN) och möjliggör Transport Layer Security (TLS) med certifikatvalidering. Läs dessa värden från betrodd programkonfiguration, inte parametrar för webbförfrågningar. Kör programmet på en värd med en hanterad identitetsändpunkt efter att identiteten har beviljats åtkomst till databasen.

Hjälpfunktionerna gör upp till tre försök att ansluta eller köra en skrivskyddad fråga när ett fel i listan uppstår. De väntar längre mellan försöken, ett återförsöksmönster som kallas exponentiell backoff. Om ett frågefel kräver en ny anslutning kastar frågehjälpfunktionen undantaget så att den anropande koden kan hantera det.

Använd en stödd PHP-version, PDO_SQLSRV-tillägget och Microsoft ODBC Driver 18 för SQL Server. För stödda autentiseringsvärden, se Ansluta med Microsoft Entra-autentisering. Återanvänd inte frågehjälparen för skrivningar eller multistatement-transaktioner utan att designa en applikationsspecifik återförsökspolicy: ett fel berättar inte alltid om en skrivning är committad.

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

Använd dessa inställningar för Azure SQL Database failover-grupper och Azure SQL Managed Instance.

  • Driver={ODBC Driver 18 for SQL Server} väljer ODBC Driver 18 uttryckligen istället för att förlita sig på drivrutinsupptäckt. Installera det innan du kör exemplet.

  • Ställ SQL_DATABASE in på det faktiska databasnamnet. Programmet dubblerar avslutande klammerparenteser och omsluter namnet med klammerparenteser innan det placeras i DSN. Att använda escape-tecken hindrar specialtecken i namnet från att ändra hur drivrutinen läser anslutningsinställningar.

  • ConnectRetryCount och ConnectRetryInterval styr ODBC:s återhämtning för inaktiva anslutningar. Satsens frågetimeout begränsar återhämtningen under exekveringen. Med provets 30-sekunders frågetimeout kan ODBC sluta innan alla fem återanslutningsförsök är uttömda. LoginTimeout=90 styr anslutningsetablering, inte den återhämtningsbudgeten. Hjälparen på applikationsnivå försöker igen vid valda serverfel; den försöker inte igen vid en frågetimeout eller upprepar delvis hämtade resultat.

  • Aktivera drivrutinsloggning tillsammans med programmets error_log() anrop. För PDO_SQLSRV, ställ in pdo_sqlsrv.log_severity i php.ini eller med ini_set() vid körning. För SQLSRV, konfigurera LogSeverity och LogSubsystems med sqlsrv_configure(). För mer information, se Loggningsaktivitet.

    ; 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
    
  • För en användartilldelad hanterad identitet, skicka identitetens ID som PDO:s $username argument (new PDO($dsn, $identityId, null, $options)). Använd identitetens klient-ID på Azure App Service eller Azure Container Instance; annars använd dess objekt-ID. PHP-drivrutinerna ärver detta beteende från den underliggande Microsoft ODBC-drivrutinen för SQL Server; för mer information, se Användning av Microsoft Entra ID med ODBC-drivrutinen. Använd PDO-konstruktorns användarnamnargument istället för att bädda in användarnamnet i DSN. Att ange null som användare (som i exemplet) väljer den systemtilldelade hanterade identiteten för Azure-värden. För SQLSRV (procedurmässig), ange UID i matrisen med anslutningsalternativ.

  • Ställ in MultiSubnetFailover=true när du ansluter till en failover-grupplyssnare, tillgänglighetsgrupplyssnare eller failoverkluster-instansändpunkt. Att ställa in den förbättrar anslutningsprestandan för både lyssnare för tillgänglighetsgrupper med enkelsubnät och med flerasubnät. Mer information finns i stöd för hög tillgänglighet, katastrofåterställning.

  • För utskalning för läsning eller en läsbar sekundär, lägg till ApplicationIntent=ReadOnly i DSN-strängen.

  • Använd den endpoint som tillhandahålls av din SQL-tjänst, inklusive dess molnspecifika domän. Undersök felmatchningar mellan certifikatnamn i stället för att inaktivera certifikatvalidering. Använd HostNameInCertificate endast när du vet det förväntade certifikatnamnet för den endpointen.

  • ODBC hämtar tokens för autentisering med hanterad identitet och tjänstens huvudnamn. Med AccessToken, förvärvar din applikation token och skickar den till föraren; ODBC skaffar den inte åt dig. Mer information finns i Använda Microsoft Entra-ID med ODBC-drivrutinen.

  • Håll anslutningsinformationen utanför din kod. Lagra det i applikationens konfigurationssystem och använd Azure Key Vault för hemligheter.

  • Med SQLSRV skickades anslutningsalternativen i arrayen till sqlsrv_connect(). Kontrollera om du har ett false returvärde och inspektera sqlsrv_errors() innan du bestämmer dig för om du ska försöka igen. Ställ in timeouts separat med QueryTimeout. Vilolägesanslutningsresiliens visar på ODBC-återanslutning, inte en applikationsnivå-omprövningsloop.

  • Hjälpfunktionerna för återförsök läser $e->errorInfo[1], skyddade av isset(). PDOException::$errorInfo deklareras som ?array och har standardvärdet null, så den defensiva kontrollen använder en drivrutinskod på 0 som reserv och låter SQLSTATE-prefixet 08 avgöra om ett nytt försök ska göras.

Mer information om varje del av den här konfigurationen finns i:

Katalogen med Azure SQL tillfälliga fel finns i Felsöka tillfälliga anslutningsfel.

Viktiga funktioner

  • Två PHP-API:er: SQLSRV tillhandahåller procedurfunktioner. PDO_SQLSRV implementerar PDO. Installera antingen en förlängning eller båda.
  • Brett plattformsstöd: Körs på Windows, Linux och macOS med stödda PHP-versioner.
  • Krypterade anslutningar: TLS-krypterade anslutningar via Encrypt=true, med validering av servercertifikat kontrollerad av TrustServerCertificate.
  • Microsoft Entra ID-autentisering: Hanterad identitet, tjänsteprincip och externt förvärvade åtkomsttokens via den underliggande Microsoft ODBC-drivrutinen för SQL Server. Managed Identity är lösenordslös; ActiveDirectoryServicePrincipal använder en klienthemlighet.
  • Always Encrypted: Kryptera känsliga kolumner på klienten, med säkra enklaver för stödda operationer på krypterade data.
  • Anslutningstålighet: Inbyggda återförsök för inaktiva anslutningar med ConnectRetryCount och ConnectRetryInterval.
  • PHP-strömmar: Skicka stora binära och teckenvärden från strömparametrar med något av API:erna. Använd SQLSRV för strömmande hämtning.
  • Stöd för datatyper i Rich SQL Server: datetimeoffset, tabellvärda parametrar, nvarchar och Unicode med PDO::SQLSRV_ENCODING_UTF8.

Get started

Artikel Description
Systemkrav Stödde PHP, operativsystem och SQL Server-versioner.
Supportmatris Detaljerad kompatibilitetsmatris för PHP-drivrutinsreleaser.
Ladda ner Microsoft-drivrutinerna för PHP för SQL Server Ladda ner länkar och släpp artefakter.
Installationsguide för Linux och macOS Installera drivrutinen och dess ODBC-förkunskaper på Linux och macOS.
Inläsning av drivrutiner Aktivera tilläggen i php.ini.
Snabbstart: Koppla upp dig och fråga med Microsoft-drivrutinerna för PHP Verifiera tilläggen, konfigurera en anslutning och kör samma parameteriserade fråga med SQLSRV eller PDO_SQLSRV.
Översikt av PHP SQL-drivrutinen Vad som finns i paketet, och när man ska välja SQLSRV eller PDO_SQLSRV.

Konfigurera och ansluta

Artikel Description
Anslutning till servern Öppna en anslutning till en SQL Server-instans från PHP.
Anslutningsalternativ Fullständig referens för anslutningsnyckelord, standardinställningar och hur man sätter dem.
Ansluta till Microsoft Azure SQL Database Koppla en PHP-applikation till Azure SQL Database.
Koppla upp på en angiven port Rikta in dig på en icke-standard TCP-port.
Anslutningspoolning Återanvänd ODBC-anslutningar över PHP-förfrågningar.
Inaktivera flera aktiva resultatuppsättningar (MARS) Stäng av MARS för kompatibilitet.
Stöd för LocalDB Anslut dig till en SQL Server LocalDB-instans.
Stöd för hög tillgänglighet, katastrofåterställning Tillgänglighetsgrupplyssnare och redundans för flera undernät.
Vilolägesanslutningsresiliens Automatisk återanslutning vid trasiga viloförbindelser.

Authenticate

Artikel Description
Ansluta med Microsoft Entra-autentisering Flöden för hanterad identitet, tjänstehuvudansvarig, åtkomsttoken och lösenord.
Koppla upp med SQL Server-autentisering Använd en SQL-inloggning med användarnamn och lösenord.
Koppla upp dig med Windows authentication Använd integrerad autentisering på Windows eller Kerberos på Linux och macOS.

Secure

Artikel Description
Säkerhetsöverväganden Hotmodell och defensiv djupgående vägledning för PHP-applikationer.
Alltid krypterat med PHP-drivrutinerna Konfigurera kryptering på klientsidan för känsliga kolumner.
Always Encrypted med säkra enklaver Möjliggör fler funktioner för krypterade kolumner med säkra enklaver.

Hämta och uppdatera data

Artikel Description
Programguide Hitta programmeringsuppgifter för båda förarna.
Jämförelse av exekveringsfunktioner Välj rätt exekveringsfunktion för din arbetsbelastning.
Direkt och förberedd satsexekvering (PDO_SQLSRV) När man ska använda direkt exekvering kontra förberedda satser.
Hämta data Hämta rader, kolumner och strömningsvärden.
Uppdatering av data Lägg in, uppdatera och ta bort rader.
Utför parameteriserade frågor Bind parametrar för att skydda mot SQL-injektion.
Skicka data som ström Strömma stora binära och teckenvärden till SQL Server.
Genomföra transaktioner Genomför eller rulla tillbaka en grupp satser tillsammans.
Använd tabellvärda parametrar Skicka en TABLE parameter till en lagrad procedur.
Ange en markörtyp och markera rader Välj framåtriktade, statisk, dynamisk eller keyset-markörer.

Datatyper

Artikel Description
Konvertering av datatyper Hur drivrutinen mappar PHP-typer till SQL Server-typer.
Standardtyper av SQL Server-data Standard SQL Server-typ för varje PHP-värde.
Standard PHP-datatyper Standard PHP-typ för varje SQL Server-kolumntyp.
Specificera SQL Server-datatyper (SQLSRV) Åsidosätt SQL Server-typen vid bindning av parametrar.
Specificera PHP-datatyper Åsidosätt PHP-typen när du hämtar.
Skicka och hämta UTF-8-data Ställ in SQLSRV:s CharacterSet alternativ eller PDO_SQLSRV's PDO::SQLSRV_ATTR_ENCODING attribut.
Skicka och hämta ASCII-data på Linux och macOS Hantera ASCII-tur- och returkonverteringar på värddatorer som inte kör Windows.
Formatera decimaler och pengar (SQLSRV) Formatera decimal - och penningkolumner med SQLSRV-drivrutinen.
Formatera decimaler och valuta (PDO_SQLSRV) Formatera kolumner av typen decimal och money med drivrutinen PDO_SQLSRV.
Icke-systembaserade platsinställningar Lokaliserade decimalseparatorer och andra lokala överväganden.

Fel och diagnostik

Artikel Description
Hantering av fel och varningar Fel- och varningshantering med båda drivrutinerna.
Konfigurera fel- och varningshantering (SQLSRV) Justera hur SQLSRV-drivrutinen rapporterar fel och varningar.
Hantera fel och varningar (SQLSRV) Inspektera fel som returneras av SQLSRV-funktioner.
Loggningsaktivitet Aktivera drivrutinsloggning för diagnostikfångst.

Distribuera och driva

Artikel Description
Prestandaoptimering Anslutningshantering, batching, förberedda satser, markörer, minne och serverövervakning.
Felsökning Diagnostisera vanliga problem med installationer, anslutningar, förfrågningar, datatyp, transaktioner och container.

Referensinnehåll

Artikel Description
API-referens för SQLSRV-drivrutinen Alla sqlsrv_* funktioner, parametrar och returvärden.
PDO_SQLSRV förarreferens PDO- och PDOStatement-metoder stöds av den PDO_SQLSRV drivrutinen.
Konstanter Konstanter som exponeras av drivrutinerna, inklusive typ- och kodningskonstanter.
Artikel Description
Viktig information Per-versionshistorik med nya funktioner, buggfixar, plattformsstödändringar och nedladdningslänkar.
Om kodexempel i dokumentationen Konventioner som används av kodexemplen i detta avsnitt.
Kodexempel för PHP SQL-drivrutinen End-to-end-exempelapplikationer för SQLSRV och PDO_SQLSRV.
Stödresurser Gemenskap och stödkanaler.

Begär en funktion

För att begära en funktion, öppna ett problem i Microsoft Drivers for PHP för SQL Server GitHub repository.