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 :

faire un rollback en présence d'une erreur qui n'a rien à voir avec la bdd


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut faire un rollback en présence d'une erreur qui n'a rien à voir avec la bdd
    Bonjour,

    j'effectue un try/catch dans le cadre d'une transaction ce qui fait que le commit ne sera effectué que si la requête (un INSERT) sera exécutée sans problème. Cela dit, si une autre erreur PHP se produit, on va aller dans le catch et on fera un rollback.
    Mon code est le suivant :
    Code php : 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
     public function save(string $email = null, int $sesa, ?int $id = 0) {
     
            try
            {
                $ppp = new PDOPlusPlus();
     
                $ppp->startTransaction();
     
                $local_address = explode("@",$email)[0];
                $domain = explode("@",$email)[1];
     
                if ( $id ===  0)
                { //si $email pas en bdd, alors insert
                    $sql = <<<sql
    INSERT INTO em_mail
    SET 
        EM_email = {$ppp($local_address)},
        DM_ident = (SELECT DM_ident FROM DM_domain WHERE DM_domain_name = {$ppp($domain)}),
        US_ident = (SELECT US_ident FROM US_user WHERE US_sesa = {$ppp($sesa,
                        'int')})
    sql;
                    $id = $ppp->insert($sql);
                    $ppp->commit();
     
                }
            }
     
     
            catch (\Exception $e) {
                    $ppp->rollback();
                } // sur cette table, pas d'update
        }
    Une erreur surviendra si $email est null. Si c'est le cas, on passera dans le catch avant l'exécution de la requête et donc un rollback sera exécuté. Cette façon de faire est-elle convenable ?

  2. #2
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour Laurent,

    on ne doit pas provoquer volontairement une erreur PHP ou SQL.
    Ça n'a pas de sens.

    C'est comme :
    • descendre une côte à vélo, SANS vérifier les freins,
    • et attendre de se prendre un gadin pour dire : "Ah, les freins ne vont pas !"

    (ça te rappelle des souvenirs ? )


    Il faut faire les vérifications nécessaires concernant $email.
    • vérifier qu'il est non NULL
    • vérifier que c'est bien un email : filter_var($email, FILTER_VALIDATE_EMAIL),
    • et si PAS d'erreur, on lance la requête

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 987
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    save(string $email = null, int $sesa, ?int $id = 0)
    Attention, tu t'emmêles les pinceaux avec tes paramètres de fonction.

    Lorsque tu donnes une valeur par défaut à un paramètre c'est que tu veux le rendre optionnel, or les paramètres optionnels d'une fonction/méthode sont toujours à la fin*, après les paramètres obligatoires. Donc pas la peine de donner une valeur par défaut à $email qui de toute façon (je pense) est obligatoire. De plus dés lors que tu utilises le type "string" pour ce paramètre, en aucun cas celui-ci ne devrait accepter pour valeur null. (qu'il convertira en chaîne vide automatiquement, ou alors tu obtiendras une erreur fatale à la compilation si tu es en mode type strict).

    Pour le dernier paramètre $id: es-tu sûr que la valeur par défaut doit-être 0 et pas null puisque tu as mis un ? avant int? Si ce n'est pas le cas et que ce paramètre ne peut jamais être null, alors le ? est inutile.

    *sauf si tu utilises les paramètres nommés de PHP 8 et dans ce cas, l'ordre n'a plus d'importance.

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    ça te rappelle des souvenirs ?
    chu devenu expert de cette question

    pour les contrôles, j'ai remplacé
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $local_address = explode("@",$email)[0];
    $domain = explode("@",$email)[1];
    par
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $explode_email = explode("@",$email??[]);
    if (( isset($explode_email) ) && (count($explode_email) == 2) )
    {
          $local_address = $explode_email[0];
          $domain = $explode_email[1];
    }
    Qu'en penses-tu Jérôme ?

    Suite aux remarques de Cosmo : public function save(string $email, int $sesa, int $id = 0)

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 987
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $explode_email = explode("@",$email??[]);
    if (( isset($explode_email) ) //...
    Quelque soit le scénario $explode_email sera toujours défini. Pourquoi veux-tu passer un tableau à explode?

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    ...car je me suis trompé (confusion avec implode) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                $explode_email = explode("@",$email??"");
                if (count($explode_email) == 2)
                {
                    $local_address = $explode_email[0];
                    $domain = $explode_email[1];
                }
    $email??"", c'est pour passer une chaine vide à explode si $email n'existe pas pour qu'il n'y ait pas d'erreur.

    Juste après, j'ai aussi mis if ( ( $id == 0) && (isset($local_address)) && (isset($domain)) )

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Cela dit, si une autre erreur PHP se produit, on va aller dans le catch et on fera un rollback.
    Il suffit de spécialiser le catch qui provoque le rollback.

    AVec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (\Exception $e) {
        $ppp->rollback();
    }
    Tu rollback quelque soit l'exception , puisque tu utilises Exception qui est la base de toutes les exception.

    Tu pourrais donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    catch (\PDOException $e) { // Erreur lié à PDO
        $ppp->rollback();
    }
    catch (\Exception $e) { // Multiple catch supporté a partir de PHP 7.1
    	// Faire autre chose
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 02/02/2017, 12h37
  2. Réponses: 2
    Dernier message: 05/06/2013, 18h46
  3. Réponses: 4
    Dernier message: 19/07/2007, 19h02
  4. une erreur qui se produit sur un code VBA
    Par bambi98 dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/02/2007, 15h13
  5. Faire rendre MySQL plus explicite sur une erreur
    Par Xunil dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/11/2006, 17h33

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