L'access SQL Server à partir de PHP (PDO) ne fonctionne pas malgré le pilote installé et activé

J'essaie d'accéder à un server SQL

MISE À JOUR: En réponse aux commentaires de Clive ci-dessous, j'ai également essayé de réinstaller le pilote ODBC natif mais pas de changement.

J'ai vérifié toutes les questions que je peux find à ce sujet et tout semble être en ordre. Mes détails de server:

PHP 5.4 (géré via Plesk) SQL Server 2008 R2 SP2 Windows Server 2008 R2

Les derniers pilotes mssql pour PDO sont dans le directory EXT et référencés dans php.ini: extension = extension php_sqlsrv_54_nts.dll = php_pdo_sqlsrv_54_nts.dll

PHPINFO () donne ce qui suit:

Pilotes PDO: mysql, sqlite, sqlsrv Prise en charge de pdo_sqlsrv: enabled Prise en charge de sqlsrv: activée

Ma string de connection ressemble à ceci:

$DSN = "sqlsrv:Server=myDbServer,1433;database=my-dbname"; $PdoOptions = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); $sparklyGenericPdoObj = new PDO($DSN,'myUsername','myPasswurde', $PdoOptions); 

Mais cela me donne juste l'erreur suivante qui lie – de façon détournée – aux pilotes que j'ai déjà installés (j'ai vérifié les numéros de version):

Erreur fatale PHP: exception non interceptée 'PDOException' avec le message 'SQLSTATE [IMSSP]: cette extension nécessite le pilote ODBC Microsoft SQL Server 2012 Native Client pour communiquer avec SQL Server. Accédez à l'URL suivante pour download le pilote ODBC Microsoft SQL Server 2012 Native Client pour x86: http://go.microsoft.com/fwlink/?LinkId=163712 '

Sur ce fil (rapportant exactement la même erreur que moi) est une solution qui dit que vous pouvez confirmer que le pilote est installé en recherchant les éléments que j'ai mentionnés ci-dessus dans PHPINFO: Ne pas se connecter à Sql Server 2012 !

Toute aide serait très appréciée!

Bien que ce soit un post assez ancien, j'ai décidé qu'il vaudrait mieux placer ma réponse ici au lieu de créer une autre question …

Après 3 semaines de search sur le Web et testant beaucoup d'hypothèses autour de l'installation php, du code php et de l'installation des drivers, j'ai finalement trouvé la solution à cette question.

LE PROBLÈME:

J'ai une application qui est installée sur WIN SERVER 2012 SP2 et fonctionne sous IIS. Le développement de cette application est faite sur un WIN 7 SP1 et fonctionnant sous 32 bits XAMPP 3.2.2. Tout cela tourne sous PHP 5.6.

Tout fonctionne correctement sur le server mais je garde ce message quand il est exécuté localement sur XAMPP:

Cette extension nécessite le pilote Microsoft ODBC 11 pour SQL Server pour communiquer avec SQL Server

Même si j'ai installé ce pilote plusieurs fois (avec d'autres pilotes php trouvés ici , configurez mon php.ini pour charger php_sqlsrv_56_ts.dll et php_pdo_sqlsrv_56_ts.dll), il ne cesse de me returnner le même message …

La command PDO que j'ai utilisée pour me connecter au server MSSQL distant était:

$db = new PDO("sqlsrv:server=192.168.165.XXX;Database=testDB;", "userName", "passWord");

J'ai essayé d'autres pilotes et cela a fonctionné assez bien avec le pilote ODBC;

$db = new PDO("odbc:Driver={SQL Server};Server=192.168.165.XXX;Database=testDB;", "userName", "passWord");

mais j'ai trouvé qu'il y avait quelques limitations avec le dernier pilote que je n'ai pas rencontré avec sqlsrv sur le server PROD donc j'ai décidé de pousser un peu plus mes searchs pour find un moyen d'implémenter sqlsrv sur ma machine locale. .

L'ENQUÊTE:

Avant de me connecter avec PHP, j'ai essayé de créer un DSN système (Data Source Name), avec l'application ODBC Source Administrator (ODBCSA) et de tester la connection à partir de là avant d'essayer de me connecter avec mon application. Quelque chose d'assez étrange que j'ai découvert avec Win7, c'est qu'il existe deux applications ODBCSA différentes.

La version 32 bits du file Odbcad32.exe se trouve dans le dossier% systemdrive% \ Windows \ SysWoW64.

La version 64 bits du file Odbcad32.exe se trouve dans le dossier% systemdrive% \ Windows \ System32.

La version 32 bits de l'outil Administrateur ODBC affiche les DSN système 32 bits, les DSN user 32 bits et les DSN user 64 bits.

La version 64 bits de l'outil Administrateur ODBC affiche les DSN système 64 bits , les DSN user 32 bits et les DSN user 64 bits

Juste pour vous assurer de ce que vous utilisez ODBCA, vérifiez dans Gestionnaire des tâches sous odbcad32.exe, si vous voyez * 32 sur sa droite, cela signifie que c'est la version 32 bits.

Au début, j'ai exécuté l'ODBCSA 64 bits, créé DSN en utilisant le pilote ODBC 11 nouvellement installé, appelé ODBC_11_64 et testé la connection en utilisant l'ODBCSA. Tout a bien fonctionné. Lorsque j'ai testé mon code, j'ai reçu un autre message d'erreur:

Le DSN spécifié contient une non-concordance d'architecture entre le pilote et l'application

Ok, j'ai essayé de créer un nouveau DSN en utilisant l'ODBCSA 32 bits. C'était étrange au début, quand j'ai découvert qu'il n'y avait pas de numéro de version mis à part quelques noms de pilotes et j'ai reçu cette erreur de la part d'ODBCSA:

Les routines d'installation pour le pilote ODBC 11 pour SQL Server n'ont pas pu être trouvées. Veuillez réinstaller le pilote.

et un autre message:

Composant introuvable dans le registre

Il était évident qu'il y avait un problème d'installation et le message postérieur me pointe dans la bonne direction, le registre …

En démarrant regedit en tant qu'administrateur, j'ai trouvé que tous les pilotes ODBC 64 bits peuvent être trouvés ici: HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI

Tous les pilotes ODBC 32 bits peuvent être trouvés ici: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI

Alors que j'essayais d'accéder à la key 64 bits (\ ODBC Driver 11 pour SQL Server), j'étais capable d'afficher les valeurs des keys mais lorsque j'ai essayé d'accéder à la key 32 bits, j'ai reçu ce message:

Erreur lors de l'ouverture de la key, le pilote ODBC 11 pour le pilote SQL Server ne peut pas être ouvert. Une erreur empêche l'ouverture de cette key. Détails: L'access est refusé.

LA SOLUTION:

En cliquant avec le button droit sur la key défectueuse de 32 bits, j'ai pu accéder à l'interface d'autorisation. J'ai alors pu append mon nom d'user (je pourrais également append un groupe) et avoir le plein contrôle sur la key de registre.

Je suis ensuite revenu à la création d'un nouveau DSN en utilisant ODBCSA 32 bits et ODBC Driver 11 pour SQL Server, testé la connection avec SUCCESS! 🙂

Je suis revenu à mon application et j'ai découvert que j'étais capable d'accéder au server distant MSSQL en utilisant sqlsrv, sur ma machine locale.

Tout au long c'était le package d'installation du pilote qui était défectueux! Je devrais avoir des permissions d'installation pour SYSTEM, les users et les administrateurs de la key a fait avec la key de registre 64 bits pour ce pilote.

C'était une histoire assez longue mais je pensais que ça en valait la peine, car beaucoup de personnes ont essayé de résoudre ce problème complexe, allant dans beaucoup de directions différentes sans succès. C'est aussi ma consortingbution à vous tous, qui n'a pas réussi à find la solution mais m'a aidé dans mon enquête 😉

À la fin, j'ai résolu cela en installant les "Utilitaires de command line Microsoft® SQL Server® 2012 SP1" à partir d'ici (SqlCmdLnUtils.msi):

http://www.microsoft.com/en-in/download/details.aspx?id=35580

Aucune idée pourquoi cela a fonctionné mais il est là.