IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

MySQLi : détection d'erreur sur ouverture de connexion (instanciation) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 277
    Points : 64
    Points
    64
    Par défaut MySQLi : détection d'erreur sur ouverture de connexion (instanciation)
    Bonjour,

    Je suis ennoyé avec mysqli. Je n'arrive pas a détecter plusieurs cas d'erreurs sur la création d'instance de mysqli. Voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try {
    	$this->id_connexion = new mysqli($this->sql_server, $this->sql_server_login, $this->sql_server_password);
    } catch(Exception $e) {
    	echo $e->getMessage();
    }
    if ($this->id_connexion->connect_errno) {
    	printf("Echec de la connexion: %s\n", $this->id_connexion->connect_error);
    	//exit();
    	return false;
    }

    J'ai 2 gros soucie. Le premier est que j'ai un gros warning avec le new msqli (args...) dont j'ai mis le code plus haut. Le warning exact est :
    Warning: mysqli::mysqli(): in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC11\data\localweb\xxxmasquéxxx\src\support\database.php. Ce warning arrive lorsque la connexion a échoué, parce que le serveur MySQL ou l'un des autres paramètres est incorrect. Mon problème est que je n'intercepte pas ce warning, même avec le bloc try/catch mis plus haut. Comment faire pour l'intercepter et ne pas afficher ce Warning ? Je ne veux pas, vous vous en doutez, désactiver tous les warning avec une error_reporting(all): je veux l'intercepter.

    Ma seconde question concerne le cas particulier où tous les paramètres sont vide : $this->sql_server, $this->sql_server_login, $this->sql_server_password, tous vides. Cela ne génère aucune erreur et je ne sais pas l'intercepter. Pour m'en sortir j'ai mis un gros hack : je teste si les paramètres sont vides, mais c'est bourrin je trouve. Est-ce que il y a mieux ? En particulier je pensais pouvoir intercepter ce cas particulier avec le connect_errno (voir le code juste au dessus) mais ca ne fonctionne pas bien lorsque, précisément, tous les champ sont vides. Comment faire ?


    Note: le $this->id_connexion c'est l'id renvoyé par le new mysqli, vous l'avez compris.

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Tu ne détectes pas l'erreur dans le try/catch car un try/catch ne sert qu'à intercepter les exceptions lancées (ex : throw new Exception('....')).

    Dans ta configuration PHP, tu devrais désactiver l'affichage des warning, ce sera par ailleurs le cas sur ton serveur de production.

    Ensuite, pour tester si il y a une erreur de connexion, ce que tu utilises actuellement (connect_error) est parfait.

    Concernant ta seconde question, tester si les paramètres sont vides avant de les utiliser n'est pas bourrin, c'est exactement ce qu'il faut faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(empty($this->sql_server) || empty($this->sql_server_login) || empty($this->sql_server_password)){
        throw new Exception('sql_server, sql_server_login or sql_server_password must be set before the SQL connection can be used');
    }else{
        // c'est ok ici, on se connecte
    }

  3. #3
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 277
    Points : 64
    Points
    64
    Par défaut
    Merci Thomas.

    De mon point de vue c'est au connect_errno de détecter l'erreur lorsque les champs de connexion sont vides (en particulier le host, pour le password on peut imaginer qu'il soit vide). Cette fonction connect_errno détecte bien lorsque le host est incorrect, le mot de passe incorrect, etc. Donc...

    Es-tu certain que je doive désactiver les warning ? S'il y a un warning, c'est que il y a, en amont, une erreur non détectée. C'est ca qui m'ennui. Encore une fois, ce serait au connect_errno de le faire : il le fait dans plein de cas, il détecte, par exemple, un hostname (sql server) incorrect mais le warning persiste.

    Merci.

  4. #4
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    En prod les warnings sont toujours désactivés.

    Mais tu peux toujours les laisser si tu veux, de toutes façon j'imagine qu'en prod tu fournis toujours les bons identifiants de base de données donc ca n'a pas vraiment d'importance.

  5. #5
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 277
    Points : 64
    Points
    64
    Par défaut
    Non. Non, parce que je termine un truc où c'est l'utilisateur final qui install le truc et saisie ses informations de connexion (host, login, paassword, database). Ma gestion d'erreur doit être béton.

  6. #6
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Ha ok, dans ce cas rajoutes juste un @ pour empêcher l'affichage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @$this->id_connexion = new mysqli($this->sql_server, $this->sql_server_login, $this->sql_server_password);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2002] Erreur sur ouverture
    Par Flavien23 dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/05/2009, 09h09
  2. Msg Erreur sur Ouverture de formulaire
    Par nb_pc dans le forum IHM
    Réponses: 8
    Dernier message: 28/09/2007, 11h07
  3. Message d'erreur sur ouverture d'état/requête
    Par guiguilive dans le forum Access
    Réponses: 1
    Dernier message: 30/05/2007, 11h36
  4. Message d'erreur sur ouverture module de BDD
    Par zakiabdess dans le forum Bases de données
    Réponses: 8
    Dernier message: 12/02/2007, 21h50
  5. (VBA-E) Erreur sur ouverture de fichier
    Par Stutak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/08/2006, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo