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

Langage PHP Discussion :

Try catch avec requêtes pdo


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Try catch avec requêtes pdo
    Bonjour,

    J'ai fais des requêtes préparées en pdo puis à l’exécution j'ai besoin de voir si la requête a fonctionné ou pas. Pour ça j'ai fais le code suivant (la requête se trouve dans un autre fichier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try {
            $reqchangecouleur->bindValue(':couleur', $couleur, PDO::PARAM_STR);
    	$reqchangecouleur->bindValue(':nom', $nom, PDO::PARAM_STR);
    	$reqchangecouleur->execute();
    	$messagecouleur = '<div class="ok">La couleur a été changée</div>';
    }
    catch (Exception $e){
    	$messagecouleur = '<div class="erreur">La couleur n\'a pas été changée</div>';
    	exit();
    }
    La requête fonctionne bien mais en faisant le test pour voir ce qui se passait si elle ne fonctionnait pas je me suis rendu compte que ça ne passait jamais dans le catch. Même si rien est ajouté dans la bdd ça me met le message qui est dans le try au lieu de celui qui est dans le catch.

    Quelqu'un aurait-il une idée svp ??

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    le catch est forcement exécuté s'il y a erreur. Mais dans le catch tu n'affiches aucun message d'erreur et le programme s'interrompt avec exit( tout ce qui vient après exit est alors ignoré)

    Autre remarque qui n'a rien avoir avec ton problème. en effet en faisant un catch(Exception e), on attrape toutes les exceptions(y compris celles qui ne sont pertinemment pas liées aux erreurs sql), puisque toute exception est une sous-classe de Exception. Le mieux c'est faire un catch(PDOException e) pour traiter les exceptions liées à des erreurs sql.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     try {
        $pdo = new PDO( '...' ); 
    }
    catch( PDOException $e ) {
        echo "Erreur SQL :", $e->getMessage();
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    En fait ce qui me fait dire que ça ne va pas dans le catch c'est que $messagecouleur a pour valeur <div class="ok">La couleur a été changée</div> même si rien ne change dans la bdd.
    Pour les messages d'erreur je ne veux pas les afficher pour l'utilisateur, je veux juste que se soit mon message d'erreur à moi qui s'affiche.
    Et puis même en mettant echo "Erreur SQL :", $e->getMessage(); je n'ai aucun message qui s'affiche ...

    Merci pour le conseil je vais changer exception e pour mettre PDOException e

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Par défaut pdo ne gère pas les exceptions. As-tu configuré pdo pour qu'il gère les exception avec PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION ?

    Cela se déclare soit dans les options de la connexion soit avec setAttribute.

    Un exemple de classe de connexion avec déclaration dans les options de la connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    class C_PDO 
    {	
    	private static $connexion;
     
    	private function __construct() 
    	{
    		try
    		{	// base_connexion.php contient les variables $hostname, $database, $username, $password
    			require('Connexions/base_connexion.php');
     
    			// mode d'erreurs
    			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    			// Indispensable pour ne pas avoir execute qui formate en string avec un tableau en paramètre  (incompatible avec la clause limit)
    			$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
     
    			//Si on utilise principalement le mode objet autant le déclarer ici
    			//$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;
     
    			//charset reconnu dans la connexion à partir de php 5.3.6 auquel cas on peut supprimer l'option MYSQL_ATTR_INIT_COMMAND ci-dessous
    			//$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
     
    			// connexion avec charset avec php > 5.3.6
    			self::$connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);	
    		}
    		catch (PDOException $e)
    		{
    			// message en production
    			die('Serveur de base de données en dérangement, veuillez réessayer ultérieurement.');
     
    			// message complet en développement
    			//echo $e->getMessage();
    		}
    	}
     
    	public static function getC() 
    	{
    		if(self::$connexion == NULL) {new self();}
    		return self::$connexion;
    	}	 
    }
     
    $connexion = C_PDO::getC();

Discussions similaires

  1. try catch avec objets
    Par loustalet dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2010, 15h58
  2. Réponses: 6
    Dernier message: 07/05/2010, 10h48
  3. [MySQL] Tri tableau avec requête Where
    Par sfc2000 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 20/08/2008, 13h29
  4. [PDO] Pb avec requête PDO
    Par wolfe dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/08/2008, 13h09
  5. Procédure try-catch avec warning
    Par legreg2 dans le forum MATLAB
    Réponses: 2
    Dernier message: 18/10/2007, 13h41

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