Microsoft SQL Server depuis PHP
+
Par Remi le mardi 20 septembre 2016, 08:10 - HowTo - Lien permanent
Voici un petit récapitulatif des différents moyens d'utiliser une base de données Microsoft SQL Server depuis PHP, sous Linux.
L'ensemble des tests ont été réalisés sous Fedora 23 mais devrait fonctionner avec RHEL ou CentOS version 7.
Extensions testées:
1. Utilisation de PDO, ODBC et FreeTDS
Composants nécessaires:
- Bibliothèque freetds et extension pdo_odbc
- PHP version 5 ou 7
- Paquets RPM: freetds (EPEL), unixODBC, php-pdo, php-odbc
Configuration du pilote ODBC
Le fichier /etc/odbcinst.ini doit contenir la déclaration du pilote:
[FreeTDS] Description=FreeTDS version 0.95 Driver=/usr/lib64/libtdsodbc.so.0.0.0
Configuration de la source de données
Le fichier /etc/odbc.ini (système) ou le fichier ~/.odbc.ini (utilisateur) doit contenir la déclaration du serveur utilisé
[sqlsrv_freetds] Driver=FreeTDS Description=SQL via FreeTds Server=sqlserver.domain.tld Port=1433
Vérification de la connexion en ligne de commande
$ isql sqlsrv_freetds user secret SQL> SELECT @@version Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) SQLRowCount returns 1 1 rows fetched SQL> quit
Connexion depuis PHP
$ php -r ' echo "+ Connection\n"; $pdo = new PDO("odbc:sqlsrv_freetds", "user", "secret"); echo "+ Query\n"; $query = $pdo->query("SELECT @@version"); if ($query) { echo "+ Result\n"; $row = $query->fetch(PDO::FETCH_NUM); if ($row) { print_r($row); } } ' + Connection + Query + Result Array ( [0] => Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) )
Cette solution est souvent la plus simple car tous les paquets nécessaires sont libres et présents dans les distributions Linux.
2. Utilisation de PDO, mssql et FreeTDS
Composants nécessaires:
- Bibliothèque freetds et extension mssql
- PHP version 5 (extension dépréciée et supprimée de PHP 7)
- Paquets RPM: freetds (EPEL), php-mssql
Connexion depuis PHP
$ php -r ' echo"+ Connection:\n"; $conn = mssql_connect("sqlserver.domain.tld", "user", "secret"); if ($conn) { echo"+ Query:\n"; $query = mssql_query("SELECT @@version", $conn); if ($query) { echo"+ Result:\n"; print_r($row = mssql_fetch_array($query, MSSQL_NUM)); } } ' + Connection + Query + Result Array ( [0] => Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) )
Cette solution reste simple car tous les paquets nécessaires sont également libres et présents dans les distributions Linux. Cependant elle utilise une extension dépréciée, et sans utiliser la couche d'abstraction PDO.
3. Utilisation de PDO, ODBC et des pilotes ODBC Microsoft®
Composants nécessaires:
- Pilotes ODBC Microsoft pour SQL Server et extension pdo_odbc
- PHP version 5 ou 7
- Paquets RPM: mssqlodbc (remi), unixODBC, php-pdo, php-odbc
Configuration du pilote ODBC
Le fichier /etc/odbcinst.ini doit contenir la déclaration du pilote (ajouté automatiquement lors de l'installation) :
[ODBC Driver 13 for SQL Server] Description=Microsoft ODBC Driver for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0 Threading=1
Configuration de la source de données
Le fichier /etc/odbc.ini (système) ou le fichier ~/.odbc.ini (utilisateur) doit contenir la déclaration du serveur utilisé
[sqlsrv_msodbc] Driver=ODBC Driver 13 for SQL Server Description=SQL via Microsoft Drivers Server=sqlserver.domain.tld
Vérification de la connexion en ligne de commande
$ isql sqlsrv_msodbc user secret SQL> SELECT @@version Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) SQLRowCount returns 1 1 rows fetched SQL> quit
Connexion depuis PHP
$ php -r ' echo "+ Connection\n"; $pdo = new PDO("odbc:sqlsrv_msodbc", "user", "secret"); echo "+ Query\n"; $query = $pdo->query("SELECT @@version"); if ($query) { echo "+ Result\n"; $row = $query->fetch(PDO::FETCH_NUM); if ($row) { print_r($row); } } ' + Connection + Query + Result Array ( [0] => Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) )
Cette solution très proche de la 1 nécessite l'installation des pilotes propriétaires.
4. Utilisation des pilotes Microsoft®
Composants nécessaires :
- Pilotes ODBC Microsoft pour SQL Server et extension sqlsrv
- PHP version 7 (la version pour PHP 5 n'existe pas pour Linux)
- Paquets RPM: mssqlodbc (remi), unixODBC, php-sqlsrv (remi)
Vérification de la connexion en ligne de commande
$ sqlcmd -S sqlserver.domain.tld -U user -P secret -Q "SELECT @@version" Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) (1 rows affected)
Connexion depuis PHP
$ php -r ' echo"+ Connection:\n"; $conn = sqlsrv_connect("sqlserver.domain.tld", array("UID" => "user", "PWD" => "secret")); if ($conn) { echo"+ Query: \n"; $query = sqlsrv_query($conn, "SELECT @@version"); if ($query) { echo"+ Result:\n"; print_r($row = sqlsrv_fetch_array($query, SQLSRV_FETCH_NUMERIC)); } } ' + Connection: + Query: + Result: Array ( [0] => Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) )
Cette solution très proche de la 2 nécessite l'installation des pilotes propriétaires et n'utilise pas la couche d'abstraction PDO.
5. Utilisation de PDO et des pilotes Microsoft®
Composants nécessaires :
- Pilotes ODBC Microsoft pour SQL Server et extension pdo_sqlsrv
- PHP version 7 (la version pour PHP 5 n'existe pas pour Linux)
- Paquets RPM: mssqlodbc (remi), unixODBC, php-pdo, php-sqlsrv (remi)
Connexion depuis PHP
$ php -r ' echo "+ Connection\n"; $pdo = new PDO("sqlsrv:Server=sqlserver.domain.tld", "user", "secret"); echo "+ Query\n"; $query = $pdo->query("SELECT @@version"); if ($query) { echo "+ Result\n"; $row = $query->fetch(PDO::FETCH_NUM); if ($row) { print_r($row); } } ' + Connection + Query + Result Array ( [0] => Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) )
Cette solution très proche des 1 et 3 et nécessite aussi l'installation des pilotes propriétaires.
6. Utilisation de PDO et de FreeTDS
Composants nécessaires :
- Bibliothèque freetds et extension pdo_dblib
- PHP version 5 ou 7
- Paquets RPM: freetds (EPEL), php-pdo, php-pdo_dblib
Connexion depuis PHP
$ php -r ' echo "+ Connection\n"; $pdo = new PDO("dblib:host=sqlserver.domain.tld", "user", "secret"); echo "+ Query\n"; $query = $pdo->query("SELECT @@version"); if ($query) { echo "+ Result\n"; $row = $query->fetch(PDO::FETCH_NUM); if ($row) { print_r($row); } } ' + Connection + Query + Result Array ( [0] => Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Red Hat Enterprise Linux) )
Cette solution très proche des 1, 3 et 5 en utilisant la bibliothèque libre FreeTDS et la couche d'abstraction PDO.
7. Conclusion
Il me semble qu'utiliser PDO reste préférable afin d'éviter l'adhérence à un serveur de base de données particulier.
L'utilisation de FreeTDS a rendu de nombreux services, et était la seule disponible avec PHP 5. L'utilisation des extensions sqlsrv ou pdo_sqlsrv me semble donc plus pertinente avec PHP 7, mais nécessite malheureusement l'utilisation des pilotes propriétaires (mais bon, si vous utilisez Microsoft SQL server, vous avez déjà quitté le monde du libre).
A vous de vous faire votre idée.
Commentaires
Le code source de pilote PHP est sur https://github.com/Microsoft/msphpsql/tree/PHP-7.0-Linux
Ajout de l'utilisation de pdo_dblib.
Petite mise à jour : les tests son désormais réalisés avec le server "Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) on Linux (Red Hat Enterprise Linux)"
Voir : How to run SQL Server v.Next Public Preview on Fedora
À partir de php-sqlsrv version 4.3.0RC1, l'utilisation du dépot Microsoft est obligatoire pour le paquet msodbcsql (l'ancienne version dans mon dépôt est trop ancienne et comporte plusieurs bugs importants, Microsoft ne fournit plus d'archive utilisable pour créer mes propres paquets).
À partir de php-sqlsrv version 5.6.1, l'utilisation du paquet msodbcsql17 depuis le dépot Microsoft est obligatoire, à la place du paquet msodbcsql (ancienne version 13).