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 :

Récupérer erreur Try Catch


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    février 2012
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 224
    Points : 82
    Points
    82
    Par défaut Récupérer erreur Try Catch
    Bonjour,
    J'ai des requêtes de ce style (depuis qqls années)
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try { $sql = "SELECT * FROM users ";
      $stmt = $bdd_user->prepare($sql);
      $stmt->execute(array());
      while ($results=$stmt->fetch(PDO::FETCH_ASSOC)) {
        $array_users[$results['id']]=$results;
      }
    } catch(PDOException $e) {echo 'Erreur: '.$sql . "<br>" . $e->getMessage();}
    et je me disais
    que je n'ai jamais vu le {echo 'Erreur: '.$sql . "<br>" . $e->getMessage();} du catch

    Loin s'en faut que je n'ai jamais eu d'erreur dans mes requêtes...

    Cela correspond-t-il aux message d'erreurs orange ?
    Pourrait-on faire ?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(PDOException $e) {
    $erreur=1;
    $requete=$sql;
    }
    Puis en bas de page
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(isset($erreur)) {
    // > s'envoyer un mail avec la $requete; 
    }
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  2. #2
    Membre expérimenté

    Homme Profil pro
    développeur
    Inscrit en
    octobre 2013
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : octobre 2013
    Messages : 1 354
    Points : 1 675
    Points
    1 675
    Par défaut
    Salut,

    Dans ce cas là tu peux mettre l'envoi de mail directement dans le catch puisque tu es certains si tu es dedans que tu as eu une exception. Pourquoi faire une requête préparé si tu n'utilises pas de paramètres extérieurs? Le try catch ici à vraiment une utilité? Car ici tu récupères les utilisateurs donc au pire la table utilisateur n'existe pas donc là c'est l'application qui down.
    Juste un avis

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    avril 2007
    Messages
    8 491
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2007
    Messages : 8 491
    Points : 16 154
    Points
    16 154
    Par défaut
    Par défaut, PDO est en mode silencieux. Autrement dit, si quelque chose plante, ben ça plante, point. Si tu veux des exceptions, il faut les activer au niveau de la connexion.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Expert éminent

    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    4 817
    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 : 4 817
    Points : 9 246
    Points
    9 246
    Par défaut
    Oui tu pourrais le faire sans problème si cela te sert pour une meilleure organisation de ton code, on peut faire n'importe quoi dans le catch, à condition qu'il soit opérationnel et puisse se déclencher en cas d'erreur comme l'a dit Celira.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    février 2012
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 224
    Points : 82
    Points
    82
    Par défaut
    Ok, merci pour les réponses.
    Citation Envoyé par Celira Voir le message
    Par défaut, PDO est en mode silencieux. Autrement dit, si quelque chose plante, ben ça plante, point. Si tu veux des exceptions, il faut les activer au niveau de la connexion.
    Apparemment pour activer les exceptions il faut
    "dé commenter dans le fichier php.ini les modules pdo. " (dixit un post sur commentcamarche.net)
    Et comment cela se passe une fois le site hébergé ?
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    avril 2007
    Messages
    8 491
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2007
    Messages : 8 491
    Points : 16 154
    Points
    16 154
    Par défaut
    Citation Envoyé par feelwatt Voir le message
    "dé commenter dans le fichier php.ini les modules pdo. " (dixit un post sur commentcamarche.net)
    Nope, ça c'est pour activer PDO tout court. Pour les exceptions, c'est à faire au niveau de la connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    16 023
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 16 023
    Points : 32 821
    Points
    32 821
    Par défaut
    Bonjour,



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                $pdo = new PDO('mysql:host=localhost;port=3306;dbname=ma_base;charset=utf8','root', '', [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // ACTIVATION des erreurs PDO
                PDO::ATTR_EMULATE_PREPARES => false
                ]);
    Perso, j'ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 	// fetch mode par defaut
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",	// encodage UTF-8
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    février 2012
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 224
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par Celira Voir le message
    Nope, ça c'est pour activer PDO tout court. Pour les exceptions, c'est à faire au niveau de la connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Ah ok, je vais tenter ca. Merci.
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    février 2012
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 224
    Points : 82
    Points
    82
    Par défaut
    Ok,
    C'est là
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try
    {	
    $bdd_user = new PDO('mysql:host=localhost;dbname=users', 'root', '');
    $bdd_user->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(Exception $e)
    {
    die('Erreur : '.$e->getMessage());
    }
    Comme ca si ca merdoit, je m'envoi un mail.
    Merci Célira
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    février 2012
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 224
    Points : 82
    Points
    82
    Par défaut
    A super, Jreaux
    Je vais poser ca.
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  11. #11
    Expert éminent

    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    4 817
    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 : 4 817
    Points : 9 246
    Points
    9 246
    Par défaut
    @jreaux62
    Qu'apporte PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" puisque tu indiques déjà le charset dans le premier paramètre de la connexion $pdo = new PDO('mysql:host=localhost;port=3306;dbname=ma_base;charset=utf8',... ? Une erreur d'inattention je suppose ?

    Enfin bon, c'était plutôt pour dire qu'il y a un point sur lequel je ne suis pas d'accord dans le tuto mentionné en lien, c'est celui de conseiller de fermer la connexion PDO. Cela ne sert à rien car Php fermera la connexion tout seul dès qu'il n'en aura plus besoin, et en même temps c'est ingérable quand les scripts deviennent un peu compliqués (imbrication etc.). C'est donc contre productif car on se prend la tête pour rien.

  12. #12
    Membre chevronné Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 451
    Points : 1 936
    Points
    1 936
    Par défaut
    Bonjour,

    Le charset à la connexion permet de définir dans quel charset on va travailler. Cela comprend à la fois également le charset du fichier PHP mais aussi celui du document HTML qui sera output.
    Le SET NAMES, quant à lui, est une requête SQL qui permet de forcer l'output de SQL dans un charset (en TRES GROS, SQL va automatiquement faire un utf8_encode() avant de retourner les valeurs)

    C'est une astuce qui date de l'époque où on est passé du charset ISO au charset UTF8. Pour ne pas devoir ALTER tous les champs de nos tables pour changer le bon vieux latin1_swedish_ci (ou un truc dans le gendre, ça fait longtemps maintenant ) qui était le charset par défaut pour l'ISO à l'époque

    Les charsets c'est compliqué ^^

    EDIT :
    Il est conseillé de TOUJOURS fermer une connexion SQL.
    C'est peut-être inutile pour toi en tant qu'humain qui ne voit pas l'intérêt de gagner 1s de trajet sur ton chemin maison <-> travail mais 1s dans le monde l'informatique, c'est tout simplement ENORME ! D'autant qu'ici je ne parle que de "temps" mais ils faut aussi prendre en compte la mémoire allouée pour ton script PHP/SQL.

  13. #13
    Expert éminent

    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    4 817
    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 : 4 817
    Points : 9 246
    Points
    9 246
    Par défaut
    Citation Envoyé par darkstar123456 Voir le message
    Les charsets c'est compliqué ^^
    Oui j'en sais quelque chose, j'ai fait un tuto là dessus en 2008 pour le passage à l'UTF8. On peut le retrouver facilement en tapant "tuto utf-8 phpfrance" dans un moteur de recherche.
    Et je confirme au passage que la déclaration charset=utf8 dans le premier argument de l'initialisation de pdo permet à mysql de travailler en utf-8 (sans besoin de rajouter set Names).

    Citation Envoyé par darkstar123456 Voir le message
    EDIT :
    Il est conseillé de TOUJOURS fermer une connexion SQL.
    C'est peut-être inutile pour toi en tant qu'humain qui ne voit pas l'intérêt de gagner 1s de trajet sur ton chemin maison <-> travail mais 1s dans le monde l'informatique, c'est tout simplement ENORME ! D'autant qu'ici je ne parle que de "temps" mais ils faut aussi prendre en compte la mémoire allouée pour ton script PHP/SQL.
    Re non. La déconnexion manuelle n'est conseillée que pour les requêtes persistantes, ou encore si tu as des tonnes de code ou un traitement très long derrière ta requête. Dans les autres cas c'est un inutile et contre productif car avec un code un peu compliqué tu vas devoir ouvrir une connexion pour chaque requête pour la refermer ensuite, ce qui pour le coup est beaucoup plus pénalisant pour les performances. Et pour un code standard plus simple on ne gagne rien donc dans la pratique on ne s'en occupe pas sauf exception.

    Pour le reste on peut toujours utiliser closeCursor() pour libérer les ressources. C'est sans inconvénient car cela ne pose jamais de problème mais ce n'est indispensable que pour certains gestionnaires de base de donnée et ne concerne pas mysql par exemple.

  14. #14
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    16 023
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 16 023
    Points : 32 821
    Points
    32 821
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Qu'apporte PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" puisque tu indiques déjà le charset dans le premier paramètre de la connexion $pdo = new PDO('mysql:host=localhost;port=3306;dbname=ma_base;charset=utf8',... ? Une erreur d'inattention je suppose ?
    @ABCIWEB
    Non, je pense que j'ai dû (autrefois *) ajouter l'un sans voir qu'il y avait déjà l'autre.
    Depuis, je ne me suis pas posé la question... et je les ai laissés (c'est la ceinture ET les bretelles !)

    * (Quand j'ai passé mes 1ers sites en mysql_/ISO en PDO/UTF-8)

    ...c'était plutôt pour dire qu'il y a un point sur lequel je ne suis pas d'accord dans le tuto mentionné en lien, c'est celui de conseiller de fermer la connexion PDO. Cela ne sert à rien....
    Tu as raison, et j'en avais parlé à Dendrite.
    A la suite de quoi elle a ajouté (voir 3b - PDO - fermer la connexion, c'est bien.) :
    [...]...vous ouvrirez la connexion, vous ferez peut-être dix requêtes, de select, d'update, d'insert, toujours avec la même connexion et vous ne la fermerez qu'en fin de page.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  15. #15
    Expert éminent

    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    4 817
    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 : 4 817
    Points : 9 246
    Points
    9 246
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    @ABCIWEB
    Non, je pense que j'ai dû (autrefois *) ajouter l'un sans voir qu'il y avait déjà l'autre.
    Depuis, je ne me suis pas posé la question... et je les ai laissés (c'est la ceinture ET les bretelles !)

    * (Quand j'ai passé mes 1ers sites en mysql_/ISO en PDO/UTF-8)
    Oui, et puis initialement on ne pouvait pas déclarer le charset dans le premier argument de l'initialisation de Pdo avec mysql, setname était la seule solution. Cette option est arrivée un peu plus tard avec une version de mysql et tu t'es sans doute inspiré de différents tutos à l'époque.

    Pour dire au passage que cette possibilité dépend du gestionnaire de base de données et que dans l'absolu setname est plus universel puisqu'il ne dépend que de pdo. Mais bon quand on change de sgbd, normalement on se renseigne et il est fort probable que tous les sgbd supportent maintenant cette possibilité (je n'utilise pas MariaDB mais ce doit être identique puisqu'il a été conçu par la même personne qui a conçu mysql). Et puis comme utf-8 est devenu le charset universel du web, autant l'indiquer dans la connexion ce qui permet de mieux se concentrer sur les options.

    Après peut-être que tout comme php, mysql soit maintenant configuré par défaut en utf-8 chez la plupart des hébergeurs. C'est déjà le cas chez OVH qui par défaut utilise utf8mb4_unicode_ci sur les mutualisés. utf8mb4 permet d'enregistrer des symboles et des emojis. Pour ceux que cela intéresse plus d'info ici.

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

Discussions similaires

  1. Si erreur / try catch / swith pour gérer une exception
    Par tanaka59 dans le forum SAS Base
    Réponses: 8
    Dernier message: 07/12/2017, 14h09
  2. Php / Ajax gestion des erreurs Try/Catch ou non?
    Par deuxk dans le forum Langage
    Réponses: 1
    Dernier message: 27/11/2015, 22h44
  3. [PowerShell] erreur try catch
    Par FloFlo12 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 26/02/2015, 16h12
  4. Réponses: 2
    Dernier message: 30/10/2007, 09h41
  5. Erreur de runtime sur un try ... catch
    Par Floréal dans le forum C++
    Réponses: 14
    Dernier message: 09/09/2005, 20h15

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