PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Remi Collet : Microsoft SQL Server depuis PHP

mardi 20 septembre 2016 à 08:10

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:

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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
)

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:

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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
)

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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
)

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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
(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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
)

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 2008 R2 (SP2) - 10.50.4000.0 (X64)
    Jun 28 2012 08:36:30
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1  (Build 7600: ) (Hypervisor)
)

Cette solution très proche des 1 et 3 et nécessite aussi l'installation des pilotes propriétaires.

6. 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.

Gravatar de Remi Collet
Original post of Remi Collet.Votez pour ce billet sur Planet Libre.

Articles similaires