Microsoft SQL Server depuis PHP

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:

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 :

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 :

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.

Vus : 969
Publié par Remi Collet : 73