J'ai le script suivant pour me connecter à mon serveur Microsoft Azure.
<?php
try {
$hostname = "secrets.database.windows.net";
$dbname = "secrets";
$username = "secrets";
$pw = "secrets";
$dbh = new PDO ("dblib:Host=$hostname;dbname=$dbname","$username","$pw");
} catch (PDOException $e) {
echo "Failed to get DB handle: " . $e->getMessage() . "\n";
exit;
}
echo "Passed!";
Le script ci-dessus transmet mon ancien serveur, mais me donne le message d'erreur suivant lorsqu'il est exécuté à partir d'un nouveau serveur.
SQLSTATE[01002] Adaptive Server connection failed (severity 9)
La configuration de mon nouveau serveur PHP est la suivante:
Sudo apt-get install -y php5.6-fpm php5.6-ldap php5.6-curl php5.6-cli php5.6-mcrypt php5.6-intl php5.6-json php5.6-pdo-dblib php5.6-mysqlnd php5.6-memcached php5.6-mbstring php5.6-imap php5.6-xml php5.6-sybase
Mes chèques jusqu'ici:
1) Les deux ont la même adresse IP publique.
2) La configuration PDO/ODBC de PHP est identique.
$ php -i | grep PDO
DO
PDO support => enabled
PDO drivers => dblib, mysql, odbc
PDO Driver for FreeTDS/Sybase DB-lib => enabled
PDO Driver for MySQL => enabled
PDO_ODBC
PDO Driver for ODBC (unixODBC) => enabled
3) Je peux envoyer une requête ping à mon serveur en utilisant telnet à partir des deux serveurs en utilisant:
telnet secrets.database.windows.net 1433
Toute suggestion serait appréciée.
Après quelques recherches supplémentaires, je suis tombé sur cette réponse.
Connectez PHP à MSSQL via PDO ODBC
Il me suffisait de mettre à jour mon fichier /etc/freetds/freetds.conf
Mes changements:
Version du protocole TDS non commentée et mise à jour.
tds version = 8.0
Ajout de mssql ci-dessous exemples.
[mssql]
Host =
Port = 1433
tds version = 8.0
J'ai le même problème ici, mais il est corrigé en ajoutant une version de FreeTDS 8.0 à la connexion directement dans le code PHP:
<?php
try {
$hostname = "secrets.database.windows.net";
$dbname = "secrets";
$username = "secrets";
$pw = "secrets";
$dbh = new PDO ("dblib:version=8.0;charset=UTF-8;Host={$hostname};dbname={$dbname}", $username, $pwd);
} catch (PDOException $e) {
echo "Failed to get DB handle: " . $e->getMessage() . "\n";
exit;
}
echo "Passed!";
Dans mon cas, j'avais une faute de frappe dans $dbname
, la corriger a résolu le problème.
Dans mon cas, le mot de passe de l'utilisateur avait été réinitialisé à mon insu.