Voir la version complète : Comment récupérer le résultat d'une connexion à MySQL?
Claire.heitz
06/08/2007, 20h54
Bonjour,
je dois me connecter à une bdd distante et le problème et que dans le cas où la connexion à la base est impossible, la page met enormément de temps à se charger pour finir sur un message d'erreur qui n'interresse pas le client.
Y a t'il un moyen de tester la connexion avant d'aller plus loin? une fonction qui retournerait False ou true ?
Merci d'avance pour votre aide.
Hébergé sur un 90Plan.
Puis-je te suggérer de faire un tout petit script en PHP test_SQL.php, dans lequel tu vas :
- Ouvrir une connexion à ta base,
- Faire une requête dans une table,
- Fermer ta connexion.
Ce script te permettra, indépendamment de tous tes autres scripts, de voir si ta base de données est accessible ou non.
test_SQL.php
<?php
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP
// ****** Configuration - Debut ******
$DBhost = "mysql5-6"; // Par exemple
$DBowner = ""; // ton login ftp
$DBpw = ""; // ton password SQL
$DBName = $DBowner;
// ****** Configuration - Fin ******
$fh_db = mysql_connect($DBhost, $DBowner, $DBpw);
$Erreur = mysql_error();
echo " mysql_connect = <b>" . $Erreur . "</b> <br> <br>\n";
if (strlen($Erreur) > 0) exit;
$sel = mysql_select_db($DBName, $fh_db);
$Erreur = mysql_error();
echo " mysql_select_db = <b>" . $Erreur . "</b> <br> \n";
if ($sel) echo " Accès à la DATABASE - '<b>$DBName</b>' : OK <br> <br>";
else echo " ### PB accès à la DATABASE - '<b>$DBName</b>' <br> <br> ";
if (strlen($Erreur) > 0) exit;
// Supression de la table Tab_test_DB
$sql_query="DROP TABLE IF EXISTS `Tab_test_DB` "; // Requête
$result_query=mysql_query($sql_query); // Exécution de la requête
$Erreur = mysql_error();
echo "\$sql_query=<b>$sql_query</b> - \$result_query=<b>$result_query</b> <br> \n";
echo " Supression de la table Tab_test_DB = <b>" . $Erreur . "</b> <br> <br>\n";
if (strlen($Erreur) > 0) exit;
// Création de la table Tab_test_DB
$sql_query="CREATE TABLE `Tab_test_DB` ( `Id` int(11) NOT NULL auto_increment, `NOM` varchar(32) NOT NULL default '', `PRENOM` varchar(32) NOT NULL default '', PRIMARY KEY (`Id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 "; // Requête
$result_query=mysql_query($sql_query); // Exécution de la requête
$Erreur = mysql_error();
echo "\$sql_query=<b>$sql_query</b> - \$result_query=<b>$result_query</b> <br> \n";
echo " Création de la table Tab_test_DB <b>" . $Erreur . "</b> <br> <br>\n";
if (strlen($Erreur) > 0) exit;
// Ajout d'un enregistrement
$sql_query="INSERT INTO `Tab_test_DB` values ('','DURANDAL','Michel') "; // Requête
$result_query=mysql_query($sql_query); // Exécution de la requête
$Erreur = mysql_error();
echo "\$sql_query=<b>$sql_query</b> - \$result_query=<b>$result_query</b> <br> \n";
echo " Ajout d'un enregistrement <b>" . $Erreur . "</b> <br> <br>\n";
if (strlen($Erreur) > 0) exit;
// SELECT dans la table Tab_test_DB
$sql_query="SELECT Id, NOM, PRENOM FROM `Tab_test_DB` WHERE NOM='DURANDAL' "; // Requête
$result_query=mysql_query($sql_query); // Exécution de la requête
$Erreur = mysql_error();
echo "\$sql_query=<b>$sql_query</b> - \$result_query=<b>$result_query</b> <br> \n";
echo " SELECT dans la table Tab_test_DB <b>" . $Erreur . "</b> <br> <br>\n";
if (strlen($Erreur) > 0) exit;
$result_count_row_get = mysql_num_rows($result_query);
$Erreur = mysql_error();
echo " Nombre d'enregistrements trouvés = <b>$result_count_row_get</b> <br> \n";
if (strlen($Erreur) > 0) exit;
// Fermeture de la connexion
mysql_close($fh_db);
?>
Claire.heitz
07/08/2007, 07h47
Désolé Abogil, j'avais déjà vu ton script dans un autre post mais il ne m'apporte rien; si la connexion est impossible, il se perd dans le timeout d'essai de connexion.
Ce que je recherche c'est une fonction qui me retourne un état "true" ou "false" selon où j'arrive ou pas à me connecter et avec une réponse rapide.
. . . si la connexion est impossible, il se perd dans le timeout d'essai de connexion.
J'ai peur que tu ne trouves pas grand chose pour résoudre ton problème. :o
Claire.heitz
07/08/2007, 08h17
il y a bien la fonction mysqli qui est beaucoup plus évoluée et avec laquelle on peut définir un timout :
/* Création d'un objet de connexion, sans être connecté */
$mysqli = mysqli_init();
/* Définition des quelques options de connexion */
$mysqli->options(MYSQLI_INIT_COMMAND, "SET AUTOCOMMIT=0");
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
/* Connexion au serveur */
$mysqli->real_connect(xxxxxxxxxxxx', 'xxxx', 'xxxx', 'xxxxx');
/* Vérification de la connexion */
if (mysqli_connect_errno()) {
printf("Échec de la connexion : %s\n", mysqli_connect_error());
exit();
}
printf ("Connecté : %s\n.", $mysqli->host_info);
$mysqli->close();
Mais cette fonction n'est pas implémentée sur les 90plan.
Merci tout de même Abogil.
Quelqu'un a une autre idée ?
hello,
as tu essayé de changer la valeur de mysql.connect_timeout avec ini_set() pour pouvoir tester le retour de mysql_connect() dans un délai raisonnable?
Claire.heitz
10/08/2007, 21h14
Merci Crole.
Si je comprends bien, tu me dis de mettre la directive mysql.connect_timeout de php.ini (du serveur distant) à une plus petite valeur c'est ça?
alors effectivement, j'ai un message d'erreur plus rapidement mais toujours un message d'erreur. Moi ce que je voudrais c'est un état; connexion Ok ou connexion NOK et surtout pas de message d'erreur. Tu vois ce que je veux dire?
Merci Crole.
Si je comprends bien, tu me dis de mettre la directive mysql.connect_timeout de php.ini (du serveur distant) à une plus petite valeur c'est ça?
alors effectivement, j'ai un message d'erreur plus rapidement mais toujours un message d'erreur. Moi ce que je voudrais c'est un état; connexion Ok ou connexion NOK et surtout pas de message d'erreur. Tu vois ce que je veux dire?
La fonction ini_set() agit sur la variable du serveur qui interprète ton script (si j'ai bien compris, le serveur local dans ton cas) et la variable mysql.connect_timeout est le temps que va attendre la fonction mysql_connect() avant de t'envoyer dans les roses si elle n'a pas de réponse (du serveur distant).
Tu dois pouvoir éviter les messages d'erreurs en désactivant l'affichage des E_WARNING et tester le retour de mysql_connect() juste après (avant mysql_select_db()) pour traiter en conséquence (afficher une autre page par exemple).
Claire.heitz
13/08/2007, 21h59
Merci beaucoup Crole, je me suis en partie inspiré de ce que tu m'as dit et ai écrit ça (en simplifiant):
ini_set('mysql.connect_timeout', '2'); // ce qui a pour effet de passer outre les directives de php.ini juste le temps d'execution du script.
$TestConn=@mysql_connect($Hote,$Utilisateur,$MotDe Passe); //le fait de mettre un @ devant mysql_connect inhibe les messages d'erreurs. C'est équivalent à un ini_set('display_errors','off');
IF ($TestConn<>'')
{
...
//j'execute ma requête puisque la connection est possible
...
mysql_close($TestConn); // je n'oublie pas de clore la connection
}
Ca vous parraît propre ? malgrès le coté bricolage :o ? En tout cas ça fonctionne.
Hello,
je ne suis pas sûr que IF ($TestConn<>'') ai le résultat escompté. J'aurai plutôt vu if ($TestConn) ou if (is_resource($TestConn))
Claire.heitz
14/08/2007, 08h34
En fait j'ai juste remarqué que si je fais un
echo $TestConn;
Je ne récupére pas de False ou True mais un Resource id #1 si la connection est ok et RIEN si connection impossible.
J'ai adopté ton
if (is_resource($TestConn)) { echo "OK";}
ELSE { echo "NOK"; }
C'est plus propre.
Merci encore.
Claire
vBulletin® v.3.8.4, Copyright ©2000-2012, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org