Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Microsoft Drivers for PHP for SQL Server obejmują dwa rozszerzenia PHP: SQLSRV i PDO_SQLSRV. PDO_SQLSRV implementuje interfejs PHP Data Objects (PDO). Oba rozszerzenia wykorzystują sterownik Microsoft ODBC dla SQL Server do łączenia się z Microsoft SQL. Ich interfejsy API PHP, opcje specyficzne dla sterowników oraz domyślne typy PHP się różnią. Na przykład SQLSRV domyślnie zwraca wartości daty i czasu jako DateTime obiekty, podczas gdy PDO_SQLSRV domyślnie zwraca ciągi tekstów. Wymagania systemowe znajdują się w artykule Wymagania systemowe dla sterowników Microsoft dla PHP dla SQL Server.
Wybierz SQLSRV lub PDO_SQLSRV
| Jeśli... | Używanie |
|---|---|
| Zaczynamy nowy projekt bez kodu PDO w innym miejscu | Wybierz interfejs, z którego Twoja aplikacja będzie korzystać konsekwentnie. SQLSRV udostępnia funkcje proceduralne oraz jawne deskryptory parametrów. PDO_SQLSRV pasuje do kodu zorganizowanego wokół obiektów PDO i PDOStatement. |
| Już używam PDO z inną bazą danych (MySQL, PostgreSQL, SQLite) | PDO_SQLSRV, aby warstwa dostępu do danych pozostała spójna w różnych bazach danych. |
| Użyj frameworka lub biblioteki, która oczekuje obiektu połączenia PDO | PDO_SQLSRV. |
| Potrzebna jest ręczna kontrola wysyłania danych strumieniowych w podziale na fragmenty | SQLSRV, przy użyciu sqlsrv_send_stream_data(). PDO_SQLSRV również przesyła duże wartości, wiążąc zasób strumienia PHP z PDO::PARAM_LOB, ale wysyła cały strumień automatycznie podczas procesu execute(), a nie we fragmentach kontrolowanych przez wywołującego. |
Utrzymuj aplikację, która już wywołuje funkcje sqlsrv_* |
SQLSRV, chyba że planujesz przepisać jego kod dostępu do danych na PDO. |
Zainstaluj jedno z tych rozszerzeń lub oba. Pliki do pobrania na Windows zawierają oddzielne rozszerzenia binarne; na Linuksie i macOS instaluj pakiety sqlsrv i pdo_sqlsrv osobno. Możesz załadować oba w tym samym procesie PHP. SQLSRV zwraca zasoby połączenia i instrukcji; PDO_SQLSRV zwraca PDO i PDOStatement obiekty. Nie przekazuj zasobu z jednego API do drugiego.
Używanie PDO nie sprawia, że składnia Transact-SQL (T-SQL) jest przenośna między bazami danych. PDO daje wspólny interfejs PHP; Twoje zapytania, schemat, uwierzytelnianie i atrybuty specyficzne dla sterowników mogą nadal być specyficzne dla Microsoft SQL. Podobnie, korzystanie z rozszerzenia proceduralnego nie wymaga organizacji proceduralnej w całej aplikacji: możesz wywoływać SQLSRV ze swoich klas.
Porównaj ten sam wynik w obu API
Uruchom te programy przed wyborem reprezentacji PHP, której oczekuje twoja aplikacja. Wybierają ten sam typ integer, datę i SQL NULL, ale domyślne wartości nie są identyczne. Nie są wymagane tabele ani przykładowa baza danych.
Zainstaluj i włącz wybrane rozszerzenie. ustaw SQL_SERVER, SQL_DATABASE, SQL_USER, oraz SQL_PASSWORD w środowisku procesowym dla istniejącej testowej bazy danych SQL Server. Certyfikat serwera musi być zaufany i odpowiadać skonfigurowanemu punktowi końcowemu. Informacje o konfiguracji i bezhasłowych alternatywach Azure można znaleźć w artykule Łączenie z serwerem.
SQLSRV
Zapisz ten pełny program jako compare-sqlsrv.php, i uruchom 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);
}
Oczekiwane dane wyjściowe:
int, DateTime, null
PDO_SQLSRV
Zapisz ten osobny program jako compare-pdo.php, i uruchom php compare-pdo.php. Celowo pozostawia pobieranie wartości numerycznych i dat z domyślnymi ustawieniami PDO_SQLSRV.
<?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;
}
Oczekiwane dane wyjściowe:
string, string, null
Oba programy wyraźnie żądają nazwanych kluczy wyników. Te tablice PHP używają nazw kolumn takich jak CountValue, zamiast numerycznych indeksów opartych na zerze. SQL NULL staje się PHP null w obu API. To nie jest pusty ciąg ani brakujący wiersz wyników.
Oba programy odczytują faktyczną nazwę bazy danych, nazwę użytkownika i hasło ze środowiska. Jednokrotnie stosują sekwencje ucieczki dla tych wartości na potrzeby obsługi połączeń w stylu ODBC przez sterownik PHP. Podwojenie zamykających nawiasów klamrowych i ujęcie wartości w nawiasy klamrowe zachowuje znaki specjalne; nie zmienia nazwy bazy danych ani zapisanego hasła. Więcej informacji można znaleźć w artykule Łączenie z serwerem.
Przykłady zatrzymują się po wystąpieniu błędu i uwalniają zasoby w finally. SQLSRV raportuje awarie bazy danych przez false i sqlsrv_errors(); PDO_SQLSRV wyrzuca w przypadku awarii połączenia i wykorzystuje wyjątki dla niepowodzeń zapytań w skonfigurowanym trybie błędu. W aplikacji webowej wychwytuj te wyjątki w kodzie, który obsługuje żądanie. Zapisuj szczegóły diagnostyczne w chronionych logach zamiast zwracać je do przeglądarki.
Po ćwiczeniu usuń compare-sqlsrv.php i compare-pdo.php jeśli już nie potrzebujesz ich więcej. Po zakończeniu testu usuń zmienne środowiska uwierzytelniania z procesu testowego.
Wybierz typy, kodowanie i obsługę błędów
Zdecyduj, jakich typów PHP oczekuje twoja aplikacja, jak radzi sobie z tekstem i błędami oraz kiedy zwalnia zasoby bazy danych.
| Decyzja | SQLSRV | PDO_SQLSRV | Wpływ na kod aplikacji |
|---|---|---|---|
| Typy wyników całkowitoliczbowych | Natywne liczby całkowite PHP dla kolumn SQL int. | Domyślnie ciągi znaków; PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE żąda obsługiwanych numerycznych typów PHP. |
Ścisłe porównania i zserializowane dane wyjściowe mogą się różnić. Nie zakładaj, że każdy typ numeryczny SQL pasuje do liczby całkowitej PHP lub typu float PHP. |
| Wyniki dotyczące daty i godziny |
DateTime domyślnie wybiera obiekty; ReturnDatesAsStrings wybiera ciągi znaków. |
Domyślnie wybierane są ciągi znaków; PDO::SQLSRV_ATTR_FETCHES_DATETIME_TYPE wybiera obiekty. |
Znormalizuj reprezentację przed serializacją lub przekazaniem jej do kodu aplikacji. |
| Kodowanie znaków | Ustaw CharacterSet => 'UTF-8' jawnie. |
UTF-8 jest domyślne; skonfiguruj je za pomocą PDO::SQLSRV_ATTR_ENCODING. |
Nie przenosz opcji SQLSRV do PDO DSN. |
| Obsługa błędów | Natychmiast sprawdź i przechwyć false pełną kolekcję błędów SQLSRV. |
Skonfiguruj PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION. |
Brakujący wiersz i nieudane zapytanie wymagają innego podejścia. |
| Ponowne wykorzystanie parametrów | Wiązanie zmiennych według odniesienia w sqlsrv_prepare() deskryptorach. |
Zastosowanie bindParam() dla zmiennej lub bindValue() dla jej aktualnej wartości. |
Przypisanie zmiennej wpływa na wiązanie referencyjne, a nie na przypisanie wartości wcześniej. |
| Cleanup | Wolne wypowiedzi, a następnie zamknij zasób połączenia. | Oświadczenie o zwolnieniu odnosi się do oświadczenia, a następnie do obiektu PDO. | Postanowienie może utrzymać połączenie PDO przy życiu po ustawieniu innego odwołania na .null |
Jeśli migrujesz istniejącą aplikację, testuj te zachowania na reprezentatywnych danych testowych przed zmianą kodu bazy danych. Zawieraj tekst niebędący ASCII, SQL NULL, daty, dokładne wartości dziesiętne oraz parametry wyjściowe procedur składowanych. Porównaj też, jak Twój framework konfiguruje atrybuty PDO. Samo zastąpienie nazw funkcji nie powoduje migracji obsługi błędów, wiązania referencji ani zwracanych typów PHP.
Aby uzyskać przepracowany workflow zapisu i odczytu z obiema API, skorzystaj z przewodnika programistycznego. Do powtarzanego wykonania i typowanych wejść użyj funkcji porównywania wykonywania zapytań.
Wiedz, do czego służy każdy komponent
Twój wybór rozszerzenia zmienia API PHP i konwersje jego typów. Oba rozszerzenia wykorzystują ODBC do komunikacji z serwerem, szyfrowania połączeń i uwierzytelniania. System operacyjny dostarcza zaufane certyfikaty i usługi, takie jak Windows authentication czy Kerberos. Obiekt docelowy SQL kontroluje uprawnienia, schemat oraz obsługiwane instrukcje T-SQL.
Programy porównawcze wykorzystują uwierzytelnianie SQL do serwera SQL Server. Dla Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL database in Fabric lub Warehouse in Fabric, konfiguruj punkt końcowy usługi i obsługiwaną uwierzytelniającą przed ponownym użyciem wzorca pobierania. Oba produkty Fabric wymagają uwierzytelniania Microsoft Entra ID; Warehouse wymaga także wyłączenia wielu aktywnych zestawów wyników (MARS). Skuteczne porównanie typów w SQL Server nie oznacza, że inne miejsce docelowe obsługuje każdą funkcję wymienioną w tym przeglądzie.
Co oferują oba rozszerzenia
- Zintegrowane uwierzytelnianie, uwierzytelnianie SQL oraz uwierzytelnianie Microsoft Entra ID, w zależności od obsługi przez element docelowy. Tożsamość zarządzana nie używa hasła do aplikacji;
ActiveDirectoryServicePrincipalużywa identyfikatora klienta i klucza tajnego klienta. Więcej informacji można znaleźć w artykule Łączenie z serwerem. - Zapytania parametryczne, przygotowane instrukcje SQL oraz parametry kierunkowe (wejście/wyjście). Więcej informacji można znaleźć w artykule Porównanie funkcji wykonawczych i Używanie parametrów kierunkowych.
- Transakcje, parametry wejściowe strumienia dla dużych wartości znakowych i binarnych oraz parametry tabelowe.
- Always Encrypted, w tym bezpieczne enklawy, jeśli są obsługiwane przez sterownik ODBC i docelowy SQL Server. Więcej informacji można znaleźć w artykule Using Always Encrypted with the Microsoft Drivers for PHP for SQL Server.
- Połączenia z SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, bazą danych SQL w Microsoft Fabric oraz Warehouse w Microsoft Fabric. Funkcje uwierzytelniania i SQL różnią się w zależności od celu; zobacz połączenia Azure i Fabric.
Treści powiązane
- Notatki do wydania sterowników Microsoft dla PHP dla SQL Server
- Zasoby wsparcia dla sterowników Microsoft for PHP for SQL Server
- Przykłady kodu w dokumentacji
- SQLSRV driver API reference
- Dokumentacja sterownika PDO_SQLSRV
- stałe (sterowniki firmy Microsoft dla języka PHP dla programu SQL Server)
- Wprowadzenie do Microsoft Drivers for PHP for SQL Server
- Przewodnik programistyczny dla sterowników Microsoft dla PHP dla SQL Server
- Przykładowa aplikacja (sterownik SQLSRV)