web-dev-qa-db-fra.com

Connectez PHP à MSSQL via PDO ODBC

Lorsque j'exécute ce code:

print_r(PDO::getAvailableDrivers()); 

Il indique que j'ai le pilote odbc disponible.

Array ( [0] => mysql [1] => odbc [2] => sqlite )

Cependant, quand j'essaye de l'utiliser comme ceci:

$handle = new PDO("odbc:Server=dbServerIpAddress,myportnumber;Database=mydatabase", "myusername", 'mypassword');

Cela ne fait rien - pas d'erreurs et cela ne fonctionne pas du tout. Il n'exécutera même pas au-delà de cette ligne!

Comment puis-je connecter PHP à cette base de données MSSQL via PDO et ODBC?

24
user1477388

Vous devez avoir configuré plusieurs fichiers de configuration. /etc/odbc.ini, /etc/odbcinst.ini Et /etc/freetds/freetds.conf (Ces emplacements sont valides pour Ubuntu 12.04 et probablement corrects pour la plupart des * nixes).

Vous devrez installer unixodbc et freetds (vous ne savez pas quels sont les noms des packages sur CentOS). Dans Ubuntu, ce serait apt-get install unixodbc tdsodbc.

Pour obtenir de l'aide pour les installer, consultez cette question Impossible d'installer FreeTDS via Yum Package Manager

/etc/odbc.ini (ce fichier peut être vide)

# Define a connection to a Microsoft SQL server
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssql]
Description             = MSSQL Server
Driver                  = freetds
Database                = XXXXXX
ServerName              = MSSQL
TDS_Version             = 7.1

/etc/odbcinst.ini

# Define where to find the driver for the Free TDS connections.
# Make sure you use the right driver (32-bit or 64-bit).
[freetds]
Description = MS SQL database access with Free TDS
Driver      = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
#Driver      = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup       = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount  = 1

/etc/freetds/freetds.conf (ou vous pouvez le trouver sur /etc/freetds.conf)

# The basics for defining a DSN (Data Source Name)
# [data_source_name]
#       Host = <hostname or IP address>
#       port = <port number to connect to - probably 1433>
#       tds version = <TDS version to use - probably 8.0>

# Define a connection to the Microsoft SQL Server
[mssql]
    Host = XXXXXX
    port = 1433
    tds version = 7.1

Vous devrez peut-être modifier la ligne tds version = 7.1 Ci-dessus en fonction de votre version de MSSQL.

Vous devrez redémarrer Apache après avoir effectué ces modifications.

Dans votre code PHP vous allez créer votre objet PDO comme ceci:

$pdo = new PDO("dblib:Host=mssql;dbname=$dbname", "$dbuser","$dbpwd");

Notez que votre nom d'utilisateur peut devoir être au format: domain\username.

En outre, vous saurez que cela a fonctionné si vous exécutez phpinfo() dans votre page et recherchez "freetds" qui affichera une section mssql avec freetds répertorié comme la version de la bibliothèque.

33
Benny Hill

La réponse acceptée est correcte jusqu'à l'appel réel PHP. Comme quelqu'un l'a commenté à juste titre, il devrait appeler le pilote odbc. Deuxièmement, il n'utilise pas le nom de la source de données (DSN) qui a été configuré dans odbc.ini mais crée en fait un DSN ad hoc.

$pdo = new PDO("odbc:mssql", "$dbuser","$dbpwd");

mssql fait référence à l'objet DSN dans odbc.ini

Vous pouvez créer un DSN ad hoc comme suit:

$pd = new PDO('odbc:DRIVER=FreeTDS;SERVERNAME=mssql;DATABASE=' . $dbName,
              $dbuser, $dbpass);

mssql fait désormais référence à l'objet serveur dans freetds.conf et FreeTDS l'objet pilote dans odbcinst.ini

(cela devrait vraiment être un commentaire mais je n'ai pas les points de répétition).

37
JamesP

Si vous souhaitez configurer directement une connexion pdo odbc à l'aide du pilote FreeTDS vers le serveur MS SQL, sans le spécifier dans le fichier de configuration freetds.conf.

$connection_string = "odbc:DRIVER=FreeTDS;SERVER=$serverName;PORT=$portNo;DATABASE=$dbName"; 
$conn = new PDO($connection_string, $dbUser, $dbPass);

Si vous avez un serveur MSSQL qui a une instance nommée, vous pouvez supprimer le numéro de port puis modifier $ serverName au format server_ip\instance_name Par exemple: "192.168.1.1\sqlexpress" où sqlexpress est le nom de l'instance.

$connection_string = "odbc:DRIVER=FreeTDS;SERVER=$serverName;DATABASE=$dbName"; 
$conn = new PDO($connection_string, $dbUser, $dbPass);

Veuillez noter pour configurer l'emplacement du pilote dans odbcinst.ini

[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver      = libtdsodbc.so
Setup       = libtdsS.so
2
Don