Connectez PHP à MSSQL via PDO ODBC

Quand j'exécute ce code:

print_r(PDO::getAvailableDrivers()); 

Il dit que j'ai le pilote odbc disponible.

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

Cependant, quand j'essaie de l'utiliser comme ça:

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

Ça ne fait rien – pas d'erreurs et ça ne marche pas du tout. Il ne sera même pas exécuté après cette ligne!

Comment puis-je connecter PHP à cette database MSSQL via PDO et ODBC?

Il y a plusieurs files de configuration que vous devez avoir configurés. /etc/odbc.ini , /etc/odbcinst.ini et /etc/freetds/freetds.conf (ces locations sont valides pour Ubuntu 12.04 et probablement corrects pour la plupart des * nix).

Vous aurez besoin d'installer unixodbc et freetds (pas sûr que les noms de packages sont sur CentOS). Dans Ubuntu, ce serait apt-get install unixodbc tdsodbc .

Pour get de l'aide lors de l'installation, regardez cette question Impossible d'installer FreeTDS via le gestionnaire de packages de Yum

/etc/odbc.ini (ce file est 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 find 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 changer la ligne tds version = 7.1 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 object PDO comme ceci:

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

Notez que votre nom d'user doit être au format: domain\username .

En outre, vous saurez que cela a fonctionné si vous exécutez phpinfo() dans votre page et que vous searchz "freetds" qui montrera une section mssql avec des freetds listés comme version de la bibliothèque.

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

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

mssql fait reference à l'object 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 à présent reference à l'object server dans freetds.conf et FreeTDS l'object pilote dans odbcinst.ini

(Cela devrait vraiment être un commentaire mais je n'ai pas les points de rep).