Obsługa bazy danych SQL Server w PHP

Treść dodana: 16 grudnia 2015. Ostatnia modyfikacja: 03 grudnia 2016.

Pisałem ostatnio artykuł dotyczący instalacji serwera Apache 2.4 razem z PHP 7. W środowisku biznesowym rzadko pracuje się na, co by nie mówić, dość ubogim w funkcje silniku MySQL. Znacznie częściej można spotkać rozwiązania klasy enterprise – MSSQL lub Oracle. W tym krótkim aneksie do wcześniejszego tekstu chciałbym pokazać jak uruchomić rozszerzenia pdo_sqlsrv oraz sqlsrv.

Na początek dwie bardzo ważne uwagi. Po pierwsze. Rozszerzenie wydane przez firmę Microsoft działa obecnie tylko z wersją PHP poniżej 7 czyli 5.6, 5.5 oraz 5.4. Będziemy musieli zastąpić naszą konfigurację ostatnim stabilnym wydaniem linii 5, czyli na ten moment 5.6.16. Druga uwaga – rozszerzenie działa tylko z 32-bitową wersją PHP. Zatem do dzieła.

Aktualizacja: Microsoft wypuścił już nowe wersje rozszerzeń w wersji 4, które działają z PHP 7+. Dodano również wsparcie dla 64-bitowych systemów. Nie jest zatem konieczny, tak jak poprzednio, downgrade wersji PHP.

Konieczne jest pobranie kilku plików ze strony Microsoftu:

Microsoft – sterownik PHP dla SQL Server

Link przekieruje nas do instalatora w którym wybieramy do pobrania plik SQLSRV40.EXE. Możemy od razu go uruchomić. Po podaniu dowolnej ścieżki, wypakuje nam pliki rozszerzeń PHP SQL Server. Interesują nas dwa pliki rozszerzeń, które przegrywamy do katalogu D:\Server\php-7.0.0\ext:

php_sqlsrv_7_ts_x64.dll
php_pdo_sqlsrv_7_ts_x64.dll

Standardowo należy dodać je do konfiguracji w pliku php.ini. Możemy, podobnie jak w artykule bazowym, wykorzystać plik `php.ini-development` zamieniając jego nazwę na `php.ini`. Poniżej aktywnych rozszerzeń dopisujemy:

extension=php_sqlsrv_7_ts_x64.dll
extension=php_pdo_sqlsrv_7_ts_x64.dll

Od strony PHP to wszystko, chyba że będą nam jeszcze potrzebne dodatkowe ustawienia sqlsrv. Polecam skorzystać z dokumentacji PHP aby dowiedzieć się jakie opcje można zmienić.

Pora na Apache. Modyfikujemy plik D:\Server\Apache24\conf\extra\httpd-fcgi.conf:

# Dla starszej wersji sterownika 3.2 podajemy poniżej ścieżkę dla PHP 5.6 - D:/Server/php-5.6.16-Win32
FcgidInitialEnv PATH "D:/Server/php-7.0.0;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/WINDOWS/Temp"
FcgidInitialEnv TMP "C:/WINDOWS/Temp"
FcgidInitialEnv windir "C:/WINDOWS"
FcgidIOTimeout 64
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 1000 
FcgidMaxProcesses 50 
FcgidMaxRequestLen 8131072
# Location php.ini:
# FcgidInitialEnv PHPRC "D:/Server/php-5.6.16-Win32"
FcgidInitialEnv PHPRC "D:/Server/php-7.0.0"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000

<Files ~ "\.php$>"
  AddHandler fcgid-script .php
  FcgidWrapper "D:/Server/php-7.0.0/php-cgi.exe" .php
</Files>

Restartujemy serwer. Funkcja phpinfo() powinna zwrócić informację o aktywnych rozszerzeniach:

PDO drivers 	        mysql, pgsql, sqlite, sqlsrv 
pdo_sqlsrv support	enabled
sqlsrv support	        enabled

Jeżeli tak się stało, możemy teraz przetestować nasze połączenie. Założyłem wcześniej odpowiedniego użytkownika oraz bazę.

<?php
$dsn = "sqlsrv:Server=WORK\SQLEXPRESS;Database=test";

try {
    $conn = new PDO( $dsn, 'test', 'test');
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $sth = $conn->prepare("SELECT CONVERT(VARCHAR, SERVERPROPERTY('productversion')), 
        CONVERT(VARCHAR, SERVERPROPERTY ('productlevel')), 
        CONVERT(VARCHAR, SERVERPROPERTY ('edition'))");
    $sth->execute();
    $result = $sth->fetchAll();
    print_r($result);
} catch(Exception $e) { 
    echo $e->getMessage(); 
}
Array
(
    [0] => Array
        (
            [] => Express Edition (64-bit)
            [0] => 12.0.2000.8
            [1] => RTM
            [2] => Express Edition (64-bit)
        )

)

Komentarze

Nie ma jeszcze żadnych komentarzy do wyświetlenia. Może chcesz zostać pierwszą osobą która podzieli się swoją opinią?

Dodaj komentarz

*
Nazwa zostanie wyświetlona wraz z komentarzem. Możesz też utworzyć nowe konto w serwisie, dzięki czemu uzyskasz dodatkową funkcjonalność.
*
Akceptowana jest ograniczona składnia Textile. Wszystkie tagi HTML zostaną usunięte.