Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
- För att verifiera din installation och köra en parameteriserad fråga med SQLSRV eller PDO_SQLSRV, börja med Quickstart: Koppla upp och fråga med Microsoft drivrutiner för PHP.
- För att installera drivrutinen på Linux eller macOS, börja med installationsguiden för Linux och macOS och ladda ner Microsoft-drivrutinerna för PHP för SQL Server.
- För att ansluta till Azure SQL med lösenordslös autentisering, börja med Connect med Microsoft Entra-autentisering och anslutningsalternativ.
- För att göra en befintlig app motståndskraftig mot tillfälliga fel går du till Motståndskraft för inaktiv anslutning.
- För att välja mellan SQLSRV och PDO_SQLSRV, gå till Översikt över Microsoft drivrutiner för PHP för SQL Server och Jämförande exekveringsfunktioner.
- För att diagnostisera ett installations-, anslutnings- eller frågeproblem, gå till Felsökning, Hantering av fel och varningar samt Loggning av aktivitet.
- För att göra en befintlig app snabbare, gå till Performance tuning.
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_DATABASEin 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.ConnectRetryCountochConnectRetryIntervalstyr 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=90styr 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 inpdo_sqlsrv.log_severityiphp.inieller medini_set()vid körning. För SQLSRV, konfigureraLogSeverityochLogSubsystemsmedsqlsrv_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 = 1För en användartilldelad hanterad identitet, skicka identitetens ID som PDO:s
$usernameargument (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 angenullsom användare (som i exemplet) väljer den systemtilldelade hanterade identiteten för Azure-värden. För SQLSRV (procedurmässig), angeUIDi matrisen med anslutningsalternativ.Ställ in
MultiSubnetFailover=truenä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=ReadOnlyi 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
HostNameInCertificateendast 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 ettfalsereturvärde och inspekterasqlsrv_errors()innan du bestämmer dig för om du ska försöka igen. Ställ in timeouts separat medQueryTimeout. Vilolägesanslutningsresiliens visar på ODBC-återanslutning, inte en applikationsnivå-omprövningsloop.Hjälpfunktionerna för återförsök läser
$e->errorInfo[1], skyddade avisset().PDOException::$errorInfodeklareras som?arrayoch har standardvärdetnull, så den defensiva kontrollen använder en drivrutinskod på0som reserv och låter SQLSTATE-prefixet08avgöra om ett nytt försök ska göras.
Mer information om varje del av den här konfigurationen finns i:
- Anslutningsalternativ
- Ansluta med Microsoft Entra-autentisering
- Vilolägesanslutningsresiliens
- Ansluta till Microsoft Azure SQL Database
- Stöd för hög tillgänglighet, katastrofåterställning
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 avTrustServerCertificate. -
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;
ActiveDirectoryServicePrincipalanvä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
ConnectRetryCountochConnectRetryInterval. - 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. |
Relaterade uppgifter
| 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.