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 :

transaction : faire un return si rollback [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 800
    Points : 4 268
    Points
    4 268
    Billets dans le blog
    1
    Par défaut transaction : faire un return si rollback
    Bonjour,

    utiliser une transaction sert à ne modifier la bdd que si l'ensemble des requêtes se déroule bien. OK. Par contre, la fonction (ou méthode) qui effectue la transaction a une valeur de retour qui est utilisée par le code qui l'appelle. Je me dis donc que si on fait un rollback, il faut mettre return NULL; dedans. Est-ce exact ?

    Voici un exemple de code :

    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
      try
            {
                $ppp = new PDOPlusPlus(); //super classe de rawsrc (enrobage de pdo)
     
                $ppp->startTransaction();
     
                if ( $id == 0 )
                {
                    $sql = <<<sql
    INSERT INTO US_user (US_firstname ,US_lastname,US_sesa) 
        VALUES(
               {$ppp($firstname,'str')}, 
               {$ppp($lastname, 'str')}, 
               {$ppp($sesa, 'str')}
              ) ;
    sql;
     
                    $id = $ppp->insert($sql);
                    return $id;
     
     
                    $ppp->commit();
                }
            }
     
     
            catch (\Exception $e) {
                $ppp->rollback();
                return NULL; //pour que le code appelant comprenne que la bdd n'a pas été modifiée
            }
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 413
    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 413
    Points : 5 321
    Points
    5 321
    Par défaut
    Oui par exemple, mais tu peux aussi te caler sur les fonctions build-in de PHP qui renvoient un false (comme strpos) et réservent le null plutôt lorsque la fonction ou méthode est censée retourner un objet (par exemple DateTime::createFromFormat avec un format illisible).

    Après c'est toi qui voit quelles conventions tu choisis pour ton code.

    Pourquoi utilises-tu une transaction alors qu'il n'y a qu'une seule requête?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 800
    Points : 4 268
    Points
    4 268
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse, et OK pour privilégier false quand on peut. Selon moi, false est un booléen. Si la fonction est censée retourner un entier, false ou NULL ?

    Citation Envoyé par CosmoKnacki Voir le message
    Pourquoi utilises-tu une transaction alors qu'il n'y a qu'une seule requête?
    Même si ici, un INSERT, soit il réussit, soit il échoue et alors la bdd n'est pas modifiée, pour être sûr de ne pas faire d'erreur, je préfère adopter partout la même technique.
    A noter que la technique des transactions, je viens de la découvrir et que au préalable, en plus de la classe US_user, j'envisageais une classe US_user_error, et que en cas d'erreur détectée (avant de faire les requêtes SQL, j'analyse les données), au lieu d'écrire dans US_user, j'écrivais dans US_user_error.

    EDIT : en regardant mon code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $id = $ppp->insert($sql);
    return $id;
     
    $ppp->commit();
    comme le return est placé avant le commit, je me demande si on va exécuter la requête. Qu'en penses-tu ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 413
    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 413
    Points : 5 321
    Points
    5 321
    Par défaut
    Moi je pencherais pour false (comme pour strpos).

    Effectivement, j'avais pas vu, le return doit évidemment être après le commit() sans quoi rien ne sera modifié dans la bdd.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Architecte Web / Android
    Inscrit en
    août 2003
    Messages
    6 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte Web / Android
    Secteur : Industrie

    Informations forums :
    Inscription : août 2003
    Messages : 6 368
    Points : 18 487
    Points
    18 487
    Par défaut
    Même si ici, un INSERT, soit il réussit, soit il échoue et alors la bdd n'est pas modifiée, pour être sûr de ne pas faire d'erreur, je préfère adopter partout la même technique.
    Le but des transactions c'est avant tout de maintenir l'intégrité relationnelle des données. Ca a donc de l'intérêt que quand tu as plusieurs requêtes.
    Ca peut aussi avoir un intérêt d'un point de vue performance dans certains cas bien précis (insertion en masse)

    C'est bien de vouloir standardiser tes pratiques mais il ne faut pas utiliser des techniques juste pour faire comme ailleurs , il faut que ca ai du sens.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 800
    Points : 4 268
    Points
    4 268
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses à vous 2. Cette discussion est terminée, donc je la clos, mais j'en ai créé une nouvelle car j'ai un autre problème qui n'a rien à voir : https://www.developpez.net/forums/d2.../#post11748854
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

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

Discussions similaires

  1. Comment faire un return de plusieurs ArrayList
    Par Mides dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 15/04/2012, 18h31
  2. Réponses: 1
    Dernier message: 06/12/2011, 15h27
  3. Faire un return dans un bloc try catch
    Par alizee971 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 13/08/2008, 19h38
  4. [AJAX] Faire un return dans le onreadystatechange
    Par gelko dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2006, 14h40
  5. AS - Attendre la fin d'un onLoad pour faire un return
    Par ChrOnOs83 dans le forum Flash
    Réponses: 9
    Dernier message: 31/08/2006, 17h09

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