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 :

probleme de update pour l'exécution d'une transaction


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut probleme de update pour l'exécution d'une transaction
    bonjour les amis. Le but est d'exécuter les 3 requêtes dans une transaction mais c'est seulement la dernière requête qui marche et curieusement. à l'affichage il me'envoie le message que tout s'est bien déroulé.les requêtes update ne marchent pas. Et normalement si les deux requetes ne marchent pas le commit ne devrait pas s'exécuter.
    code
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    try
     
     
    {
     
        // On se connecte à MySQL
     
        $pdo= new pdo('mysql:host=localhost;dbname=projettransaction;charset=utf8', 'root', '');
     
     
    }
     
    catch(Exception $e)
     
    {
     
        // En cas d'erreur, on affiche un message et on arrête tout
     
            die('Erreur : '.$e->getMessage());
     
    }
     
        try
    {
        //on tente d'exécuter les requêtes suivantes dans une transactions
     
        //on lance la transaction
        $pdo->beginTransaction();
     
        //nos 3 requêtes
        $pdo->query('UPDATE compte SET solde= (solde-$montant) WHERE num_compte=$comptedebiteur');
     
        $pdo->query('UPDATE compte SET solde=(solde+$montant) WHERE num_compte=$comptedebiteur');
     
        $pdo->query('INSERT INTO virement VALUES(02,"28/07/2015","'.$comptedebiteur.'","'.$comptecrediteur.'","'.$montant.'")');
     
        //si jusque là tout se passe bien on valide la transaction
     
    	$pdo->commit();
     
        //on affiche un petit message de confirmation
        echo 'Tout s\'est bien passé.';
    }
    catch(Exception $e) //en cas d'erreur
    {
        //on annule la transation
        $pdo->rollback();
     
        //on affiche un message d'erreur ainsi que les erreurs
        echo 'Tout ne s\'est pas bien passé, voir les erreurs ci-dessous<br />';
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
     
        //on arrête l'exécution s'il y a du code après
        exit();
    }

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu soustrais puis ajoutes $montant, donc tu reviens à la valeur de départ.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Il me semble que MySQL ne supporte pas systématiquement les transactions : ça dépend du moteur de stockage utilisé. Quel moteur utilises-tu ?
    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
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut
    le moteur est InnoDB
    en fait il s'agit de simuler une opération de virement donc le montant extrait d'un compte doit être ajouté sur un autre.
    mon problème c'est que les feux requêtes update marchent ensuite écrie le code de telle sorte que si l'une d'entre ne marche pas q'aucune ne marche.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Là, visiblement, tes requêtes fonctionnent toutes, mais l'opération de la 1ere requête annule la 2e, donc au final en base c'est comme si aucune des deux n'avait fonctionné.
    Essaye remplacer ta 2e requête par quelque chose qui ne peut pas marcher, par exemple : $pdo->query('UPDATE compte SET solde=\'TOTO\' WHERE num_compte=$comptedebiteur');, pour voir si la modification de la 1ere est enregistrée ou pas.
    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]

  6. #6
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut
    voilà l'intégralité du code
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     <?php include("connexion.php")?>
     <?php
     
     
     
    // On commence par récupérer les champs
    if(isset($_POST['comptedebiteur']))      $comptedebiteur=$_POST['comptedebiteur'];
    else      $comptedebiteur="";
     
    if(isset($_POST['comptecrediteur']))      $comptecrediteur=$_POST['comptecrediteur'];
    else      $comptecrediteur="";
     
    if(isset($_POST['montant']))      $montant=$_POST['montant'];
    else      $montant="";
     
     
    echo $_POST['comptedebiteur'];
     echo $_POST['comptecrediteur'];
     echo $_POST['montant'];
    // On vérifie si les champs sont vides
    if(empty($comptedebiteur) OR empty($comptecrediteur) OR empty($montant))
        {
        echo '<font color="red">Attention, champ(s) vide (s) !</font>';
        }
     
    // Aucun champ n'est vide, on peut enregistrer dans la table
    else     
        {
           // connexion à la base
            try
     
              {
     
                 // On se connecte à MySQL
     
                   $pdo= new pdo('mysql:host=localhost;dbname=projettransaction;charset=utf8', 'root', '');
     
     
               }
     
                 catch(Exception $e)
     
                {
     
        // En cas d'erreur, on affiche un message et on arrête tout
     
                  die('Erreur : '.$e->getMessage());
     
               }
     
                  try
                  {
        //on tente d'exécuter les requêtes suivantes dans une transactions
     
        //on lance la transaction
                   $pdo->beginTransaction();
     
        //nos 3 requêtes
        $pdo->query('UPDATE compte SET solde=(solde-$montant) WHERE num_compte=$comptedebiteur');
     
        $pdo->query('UPDATE compte SET solde=(solde+$montant) WHERE num_compte=$comptecrediteur');
     
        $pdo->query('INSERT INTO virement VALUES(02,"28/07/2015","'.$comptedebiteur.'","'.$comptecrediteur.'","'.$montant.'")');
     
        //si jusque là tout se passe bien on valide la transaction
     
    	$pdo->commit();
     
        //on affiche un petit message de confirmation
        echo 'Tout s\'est bien passé.';
               }
               catch(Exception $e) //en cas d'erreur
              {
        //on annule la transation
        $pdo->rollback();
     
        //on affiche un message d'erreur ainsi que les erreurs
        echo 'Tout ne s\'est pas bien passé, voir les erreurs ci-dessous<br />';
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
     
        //on arrête l'exécution s'il y a du code après
        exit();
           }
     
     
        mysql_close();  // on ferme la connexion
        }
    ?>

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/11/2010, 14h01
  2. trace d'exécution d'une transaction SQL
    Par peluche13000 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/12/2005, 17h36
  3. Réponses: 7
    Dernier message: 10/02/2005, 13h44

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