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.
De Microsoft drivrutinerna för PHP för SQL Server inkluderar två PHP-tillägg, SQLSRV och PDO_SQLSRV. PDO_SQLSRV implementerar PHP Data Objects (PDO)-gränssnittet. Båda tilläggen använder Microsoft ODBC-drivrutin för SQL Server för att ansluta till Microsoft SQL. Deras PHP-API:er, drivrutinsspecifika alternativ och standardtyper av PHP skiljer sig åt. Till exempel returnerar SQLSRV datum- och tidvärden som DateTime objekt som standard, medan PDO_SQLSRV returnerar strängar som standard. För systemkrav, se Systemkrav för Microsoft Drivers för PHP för SQL Server.
Välj SQLSRV eller PDO_SQLSRV
| Om du... | Använd |
|---|---|
| Startar du ett nytt projekt utan PDO-kod någon annanstans i projektet? | Välj vilket gränssnitt din applikation kommer att använda genomgående. SQLSRV tillhandahåller procedurfunktioner och explicita parameterbeskrivare. PDO_SQLSRV passar kod organiserad kring PDO och PDOStatement objekt. |
| Använder redan PDO med en annan databas (MySQL, PostgreSQL, SQLite) | PDO_SQLSRV, så att ditt dataåtkomstlager förblir konsekvent över databaser. |
| Använd ett ramverk eller bibliotek som förväntar sig ett PDO-anslutningsobjekt | PDO_SQLSRV. |
| Manuell kontroll, chunk för chunk, över när strömdata skickas | SQLSRV, med hjälp av sqlsrv_send_stream_data(). PDO_SQLSRV strömmar också stora värden genom att binda en PHP-strömresurs med PDO::PARAM_LOB, men den skickar hela strömmen automatiskt under execute() istället för i anroparstyrda bitar. |
Underhåll en applikation som redan anropar sqlsrv_* funktioner |
SQLSRV, om du inte planerar att skriva om dess dataåtkomstkod för PDO. |
Installera antingen ett tillägg eller båda. Windows-nedladdningar innehåller separata tilläggsbinärfiler; på Linux och macOS installerar du paketen sqlsrv och pdo_sqlsrv separat. Du kan ladda båda i samma PHP-process. SQLSRV returnerar anslutnings- och satsresurser; PDO_SQLSRV returnerar PDO och PDOStatement objekt. Skicka inte en resurs från ett API till ett annat.
Att använda PDO gör inte Transact-SQL (T-SQL) syntax portabel till en annan databas. PDO ger dig ett gemensamt PHP-gränssnitt; dina frågor, schema, autentisering och drivrutinsspecifika attribut kan fortfarande bero på Microsoft SQL. På samma sätt kräver användningen av procedurtillägget ingen procedurbaserad struktur i hela applikationen: du kan anropa SQLSRV från dina egna klasser.
Jämför samma resultat i båda API:erna
Kör dessa program innan du väljer den PHP-representation som din applikation förväntar sig. De väljer samma heltal, datum och SQL NULL, men standardvärdena är inte identiska. Inga tabeller eller exempeldatabas krävs.
Installera och ladda det valda tillägget. Sätt SQL_SERVER, SQL_DATABASE, SQL_USER, och SQL_PASSWORD i processmiljön för en befintlig SQL Server-testdatabas. Servercertifikatet måste vara betrott och matcha den konfigurerade endpointen. För installation och lösenordslösa Azure-alternativ, se Ansluta till servern.
SQLSRV
Spara hela programmet som compare-sqlsrv.php, och kör php compare-sqlsrv.php.
<?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);
}
Förväntat resultat:
int, DateTime, null
PDO_SQLSRV
Spara detta separata program som compare-pdo.php, och kör php compare-pdo.php. Den lämnar medvetet hämtning av numeriska värden och datum med PDO_SQLSRV:s standardinställningar.
<?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;
}
Förväntat resultat:
string, string, null
Båda programmen begär uttryckligen namngivna resultatnycklar. Dessa PHP-arrayer använder kolumnnamn som CountValue, istället för nollbaserade numeriska index. SQL NULL blir PHP null i båda API:erna. Det är inte den tomma strängen eller en saknad resultatrad.
Båda programmen läser av det faktiska databasnamnet, användarnamnet och lösenordet från miljön. De escaper dessa värden en gång för PHP-drivrutinens ODBC-liknande anslutningshantering. Att dubbla stängande klammer och innesluta värdet i klammerparenteser bevarar specialtecken; det byter inte namn på databasen eller ändrar det lagrade lösenordet. För mer information, se Ansluta till servern.
Exemplen stoppar vid fel och frigör resurser i finally. SQLSRV rapporterar databasfel genom false och sqlsrv_errors(); PDO_SQLSRV kastar för anslutningsfel och använder undantag för frågefel med konfigurerat felläge. I en webbapplikation, fånga dessa undantag i koden som hanterar förfrågan. Registrera diagnostiska detaljer i skyddade loggar istället för att returnera dem till en webbläsare.
Efter övningen, radera compare-sqlsrv.php och compare-pdo.php om du inte längre behöver dem. Rensa autentiseringsmiljövariablerna från testprocessen när du är klar.
Välj typer, kodning och felhantering
Bestäm vilka PHP-typer din applikation förväntar sig, hur den hanterar text och fel, och när databasresurser släpps.
| Beslut | SQLSRV | PDO_SQLSRV | Effekt på applikationskod |
|---|---|---|---|
| Resultattyper för heltal | Inbyggda PHP-heltal för SQL-int-kolumner. | Strängar som standard; PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE-begäranden stöder numeriska PHP-typer. |
Strikta jämförelser och serialiserade utdata kan skilja sig åt. Anta inte att varje SQL-numerisk typ passar ett PHP-heltal eller flyttal. |
| Datum och tid resultat |
DateTime objekt som standard; ReturnDatesAsStrings väljer strängar. |
Textsträngar som standard; PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE väljer objekt. |
Normalisera representationen innan du serialiserar eller skickar den till applikationskod. |
| Teckenkodning | Ange CharacterSet => 'UTF-8' explicit. |
UTF-8 är standard; konfigurera den med PDO::SQLSRV_ATTR_ENCODING. |
Överför inte SQLSRV-alternativet till ett PDO DSN. |
| Felhantering | Kontrollera false och fånga den kompletta SQLSRV-felsamlingen omedelbart. |
Konfigurera PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION. |
En saknad rad och en misslyckad databasfråga kräver olika hantering. |
| Parameteråteranvändning | Bind variabler genom referens i sqlsrv_prepare() deskriptorer. |
Använd bindParam() för en variabel eller bindValue() för dess aktuella värde. |
Att omtilldela variabeln påverkar en referensbindning, inte en tidigare värdebindning. |
| Cleanup | Frigör satserna och stäng sedan anslutningsresursen. | Release-satsen refererar sedan till PDO-objektet. | En sats kan hålla en PDO-anslutning vid liv efter att en annan referens satts till null. |
Om du migrerar en befintlig applikation, testa dessa beteenden med representativa värden innan du ändrar dess databaskod. Inkludera icke-ASCII-text, SQL NULL, datum, exakta decimalvärden och lagrade procedurers utdataparametrar. Jämför också hur ditt ramverk konfigurerar PDO-attribut. Att byta funktionsnamn ensam migrerar inte felhantering, referensbindning eller returnerade PHP-typer.
För ett genomarbetat skriv- och läsarbetsflöde med båda API:erna, använd programmeringsguiden. För upprepad exekvering och typade indata, använd Jämför frågeexekveringsfunktioner.
Lär dig vad varje komponent gör
Ditt val av tillägg ändrar PHP-API:et och dess typkonverteringar. Båda tilläggen använder ODBC för att kommunicera med servern, kryptera anslutningar och autentisera sig. Operativsystemet tillhandahåller betrodda certifikat och tjänster såsom Windows-autentisering eller Kerberos. SQL-målet styr behörigheter, schema och stödda T-SQL-satser.
Jämförelseprogrammen använder SQL-autentisering mot SQL Server. För Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL Database in Fabric eller Warehouse in Fabric, konfigurera service-endpoint och stödd autentisering innan du återanvänder fetch-mönstret. Båda Fabric-produkterna kräver Microsoft Entra ID-autentisering; Warehouse kräver också att flera aktiva resultatuppsättningar (MARS) inaktiveras. En lyckad typjämförelse på SQL Server visar inte att ett annat mål stöder alla funktioner som listas i denna översikt.
Vad båda tilläggen erbjuder
- Integrerad autentisering, SQL-autentisering och Microsoft Entra ID-autentisering, beroende på vad målet stöder. Managed Identity använder inte ett applikationslösenord;
ActiveDirectoryServicePrincipalanvänder ett klient-ID och klienthemlighet. För mer information, se Ansluta till servern. - Parameteriserade frågor, förberedda instruktioner och indata-/utdataparametrar. För mer information, se Jämföra exekveringsfunktioner och Använda riktningsparametrar.
- Transaktioner, ströminmatningsparametrar för stora tecken- och binärvärden samt tabellvärdesparametrar.
- Always Encrypted, inklusive säkra enklaver där ODBC-drivrutinen och SQL Server-målet har stöd för dem. För mer information, se Använda Always Encrypted med Microsofts drivrutiner för PHP för SQL Server.
- Anslutningar till SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL Database i Microsoft Fabric och Warehouse i Microsoft Fabric. Autentisering och SQL-funktioner varierar beroende på mål; se Azure- och Fabric-anslutningar.
Relaterat innehåll
- Versionsanteckningar för Microsoft Drivers för PHP för SQL Server
- Stödresurser för Microsoft-drivrutinerna för PHP för SQL Server
- Om kodexempel i dokumentationen
- API-referens för SQLSRV-drivrutinen
- PDO_SQLSRV förarreferens
- Constants (Microsoft-drivrutiner för PHP för SQL Server)
- Att komma igång med Microsoft Drivers för PHP för SQL Server
- Programmeringsguide för Microsoft Drivers för PHP för SQL Server
- Exempelapplikation (SQLSRV-drivrutin)