Přehled ovladačů Microsoftu pro PHP pro SQL Server

Stáhnout ovladač PHP

Microsoft ovladače pro PHP pro SQL Server zahrnují dvě PHP rozšíření, SQLSRV a PDO_SQLSRV. PDO_SQLSRV implementuje rozhraní PHP Data Objects (PDO). Obě rozšíření používají ovladač Microsoft ODBC pro SQL Server pro připojení k Microsoft SQL. Jejich PHP API, specifické možnosti pro ovladače a výchozí typy PHP se liší. Například SQLSRV vrací hodnoty data a času ve výchozím nastavení jako objekty DateTime, zatímco PDO_SQLSRV ve výchozím nastavení vrací řetězce. Pro systémové požadavky viz Systémové požadavky pro Microsoft Drivers for PHP for SQL Server.

Vyberte SQLSRV nebo PDO_SQLSRV

Pokud... Využití
Začínáte nový projekt bez PDO kódu jinde Vyberte rozhraní, které bude vaše aplikace používat konzistentně. SQLSRV zpřístupňuje procedurální funkce a explicitní popisovače parametrů. PDO_SQLSRV se přizpůsobí kódu organizovanému kolem objektů PDO a PDOStatement.
Už používám PDO s jinou databází (MySQL, PostgreSQL, SQLite) PDO_SQLSRV, aby vaše vrstva přístupu k datům zůstala konzistentní napříč databázemi.
Použijte framework nebo knihovnu, která očekává objekt připojení PDO PDO_SQLSRV.
Je potřeba manuálně řídit, po částech, kdy jsou data ze streamu odesílána SQLSRV, s použitím sqlsrv_send_stream_data(). PDO_SQLSRV také streamuje velké hodnoty navázáním PHP stream resource pomocí PDO::PARAM_LOB, ale celý stream odesílá automaticky během execute(), nikoli v částech řízených volajícím.
Udržovat aplikaci, která již volá sqlsrv_* funkce SQLSRV, pokud neplánujete přepsat jeho kód pro přístup k datům na PDO.

Nainstalujte buď jedno z těchto rozšíření, nebo obě. Soubory ke stažení pro Windows obsahují samostatné binární soubory rozšíření; v Linuxu a macOS nainstalujte balíčky sqlsrv a pdo_sqlsrv samostatně. Obě můžete načíst ve stejném PHP procesu. SQLSRV vrací zdroje spojení a příkazů; PDO_SQLSRV vrací PDO a PDOStatement objekty. Nepředávejte zdroj z jednoho API do druhého.

Použití PDO neznamená, že Transact-SQL (T-SQL) syntaxe je přenosná do jiné databáze. PDO vám poskytuje společné PHP rozhraní; vaše dotazy, schéma, autentizace a atributy specifické pro ovladač mohou stále záviset na Microsoft SQL. Stejně tak použití procedurálního rozšíření nevyžaduje procedurální organizaci v celé aplikaci: můžete volat SQLSRV ze svých vlastních tříd.

Porovnejte stejný výsledek v obou API

Spusť tyto programy ještě před výběrem PHP reprezentace, kterou vaše aplikace očekává. Zvolí stejné celé číslo, datum a SQL NULL, ale výchozí hodnoty nejsou totožné. Nejsou potřeba žádné tabulky ani vzorová databáze.

Nainstalujte a načtěte vybrané rozšíření. V prostředí procesu nastavte SQL_SERVER, SQL_DATABASE, SQL_USER a SQL_PASSWORD pro existující testovací databázi SQL Server. Serverový certifikát musí být důvěryhodný a odpovídat nakonfigurovanému koncovému bodu. Pro nastavení a bezheslové alternativy k Azure viz Připojení k serveru.

SQLSRV

Uložte tento kompletní program jako compare-sqlsrv.php a spusťte 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);
}

Očekávaný výstup:

int, DateTime, null

PDO_SQLSRV

Uložte tento samostatný program jako compare-pdo.php a spusťte php compare-pdo.php. Záměrně ponechává načítání čísel a dat na výchozích PDO_SQLSRV výchozích hodnotách.

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

Očekávaný výstup:

string, string, null

Oba programy explicitně požadují pojmenované výsledkové klíče. Tato PHP pole používají názvy sloupců jako CountValue, místo číselných indexů založených na nule. SQL NULL se v kterémkoli z API mění na PHP null . Není to prázdný řetězec ani chybějící řádek výsledku.

Oba programy čtou skutečný název databáze, uživatelské jméno a heslo z prostředí. Tyto hodnoty se jednou escapují pro připojení ve stylu ODBC v ovladači PHP. Zdvojení zavírajících závorek a uzavření hodnoty do závorek zachovává speciální znaky; nemění databázi ani uložené heslo. Pro více informací viz Připojení k serveru.

Příklady se zastaví na chybách a uvolní zdroje v finally. SQLSRV hlásí selhání databáze prostřednictvím false a ; sqlsrv_errors()PDO_SQLSRV hází pro selhání spojení a používá výjimky pro selhání dotazů v nastaveném chybovém režimu. V webové aplikaci zachyťte tyto výjimky v kódu, který zpracovává požadavek. Zaznamenávejte diagnostické detaily do chráněných logů místo toho, abyste je vraceli do prohlížeče.

Po cvičení smažte compare-sqlsrv.php a compare-pdo.php, pokud už je nepotřebujete. Až skončíte, vymažte proměnné prostředí přihlašovacích údajů z testovacího procesu.

Vyberte typy, kódování a zpracování chyb

Rozhodněte se, jaké typy PHP vaše aplikace očekává, jak zvládá text a chyby a kdy uvolní databázové zdroje.

Rozhodnutí SQLSRV PDO_SQLSRV Vliv na aplikační kód
Typy celočíselných výsledků Nativní PHP celá čísla pro sloupce SQL int. Ve výchozím nastavení řetězce; PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE požadavky podporují číselné typy PHP. Přísná srovnání a serializovaný výstup se mohou lišit. Nepředpokládejte, že se každý číselný typ SQL vejde do celočíselného typu PHP nebo do typu float.
Výsledky pro datum a čas DateTime vybírá objekty ve výchozím nastavení; ReturnDatesAsStrings vybírá řetězce. Ve výchozím nastavení řetězce; PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE vybírá objekty. Normalizujte reprezentaci před jejím serializováním nebo předáním do aplikačního kódu.
Kódování znaků Explicitně nastavte CharacterSet => 'UTF-8' . UTF-8 je výchozí; konfigurujte ho pomocí PDO::SQLSRV_ATTR_ENCODING. Nepřevádějte možnost SQLSRV do PDO DSN.
Zpracování chyb Okamžitě zkontrolujte a zachyťte false kompletní sbírku chyb SQLSRV. Konfigurujte PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION. Chybějící řádek a neúspěšný dotaz vyžadují odlišné řešení.
Opětovné použití parametrů Svazujte proměnné podle odkazu v sqlsrv_prepare() deskriptorech. Použijte bindParam() pro proměnnou nebo bindValue() pro její aktuální hodnotu. Opětovné přiřazení proměnné ovlivňuje referenční vazbu, nikoli předchozí vazbu hodnoty.
Cleanup Uvolněte příkazy, pak uzavřete zdroj připojení. Odkazy na poznámky k verzi, pak objekt PDO. Příkaz může udržet PDO spojení živé i poté, co je další reference nastavena na null.

Pokud migrujete existující aplikaci, otestujte tato chování s reprezentativními hodnotami před změnou kódu databáze. Zahrňte ne-ASCII text, SQL NULL, data, přesné desetinné hodnoty a výstupní parametry uložených procedur. Porovnejte také, jak váš rámec konfiguruje atributy PDO. Samotná výměna názvů funkcí nemigruje zpracování chyb, vazby referencí ani vrácené typy PHP.

Pro ukázkový postup zápisu a čtení s oběma API použijte programátorského průvodce. Pro opakované provádění a typované vstupy použijte funkce pro provádění dotazů Porovnání.

Zjistěte, co každá součást dělá

Vaše volba rozšíření mění PHP API a jeho převody typů. Obě rozšíření používají ODBC ke komunikaci se serverem, šifrování spojení a autentizaci. Operační systém poskytuje důvěryhodné certifikáty a služby, jako je Windows authentication nebo Kerberos. SQL cíl řídí oprávnění, schéma a podporované T-SQL příkazy.

Srovnávací programy používají SQL autentizaci vůči SQL Server. Pro Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL database in Fabric nebo Warehouse in Fabric konfigurujte koncový bod služby a podporovanou autentizaci před opětovným použitím vzoru načítaní. Oba produkty Fabric vyžadují autentizaci Microsoft Entra ID; Warehouse také vyžaduje vypnutí více aktivních sad výsledků (MARS). Úspěšné porovnání typů na SQL Server nedokazuje, že jiný cílový model podporuje všechny funkce uvedené v tomto přehledu.

Co obě rozšíření poskytují

  • Integrovaná autentizace, SQL autentizace a Microsoft Entra ID autentizace v závislosti na podpoře cílové jednotky. Spravovaná identita nepoužívá heslo aplikace; ActiveDirectoryServicePrincipal používá ID klienta a tajemství klienta. Pro více informací viz Připojení k serveru.
  • Parametrizované dotazy, připravené příkazy a směrové (vstupní/výstupní) parametry. Pro více informací viz Porovnání výkonových funkcí a Použití směrových parametrů.
  • Transakce, vstupní parametry proudu pro velké znaky a binární hodnoty a parametry tabulkových hodnot.
  • Vždy šifrované, včetně zabezpečených enkláv, kde je podporují ovladače ODBC a cílové SQL Server. Pro více informací viz Používání Always Encrypted s ovladači Microsoftu pro PHP pro SQL Server.
  • Připojení k SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL databázi v Microsoft Fabric a Warehouse v Microsoft Fabric. Autentizace a SQL funkce se liší podle cíle; viz Azure a Fabric připojení.