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 :

UPDATE : distinguer les erreurs des erreurs ! [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 66
    Points
    66
    Par défaut UPDATE : distinguer les erreurs des erreurs !
    Bonjour,

    Je suis en train de faire une application Windows Mobile qui doit appeler un script PHP via une liaison GPRS.

    Le but de ce script PHP est de mettre à jour la base mySQL et de faire un echo '_OK'; si tout va bien et un echo '_ERR'; en cas de problème (le test se fait avec mysql_affected_rows).

    J'ai cependant une question. Imaginons que juste au moment où le serveur exécute le mysql_query, la liaison se coupe. Le PDA ne reçoit pas le '_OK' et va donc retenter d'appeler le script. Mais, à ce moment là, le script va exécuter la même requête UPDATE, donc avec mysql_affected_rows == 0).

    Donc pour résumer, est-il possible de distinguer 2 UPDATE : celui qui échoue (par exemple un paramètre dans le WHERE ne matche aucun enregistrement) et celui qui va bien mais qui renvoie mysql_affected_rows = 0 ??


    Merci,

    Vincent

  2. #2
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Bonjour,

    Rensigne toi sur 'commit' :
    En gros, cela permet d'envoyer des requetes qui ne sont pas encore executées, et de ne les effectuer en meme temps, avec le 'commit'.
    Si un truc foire, toutes les requtes du commit sont annulées

    Z.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Merci pour ce renseignement mais je ne pense pas que cela convienne dans mon cas.

    Je vais essayer de donner un exemple assez simple.

    Avec phpMyAdmin, je crée une table t_test assez basique (id, libelle, flag)
    Dans cette table, je glisse 3 enregistrements :
    1, libelle1, 0
    2, libelle2, 0
    3, libelle3, 0

    Voilà en ce qui concerne la structure.

    Ensuite, je crée un fichier test.php (je vais simplifier ici aussi).

    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
    $ReqSQL = "UPDATE t_test
               SET flag = '". $_POST["FLAG"] . "'
               WHERE
                   id = '". $_POST["ID"] . "' ";
    
    $Result = mysql_query($ReqSQL);
    if (!$Result) {
        echo "_ERR : requete UPDATE invalide";
        die();
    }
    
    if (mysql_affected_rows() == 0) {
        echo "_PB : requete non effectuee";
        die();
    }
    
    if (mysql_affected_rows() == 1) {
        echo "_OK";
    }


    Maintenant, sur le PDA (connection GPRS <- important pour la suite), je vais créer un bout de code (que je vais mettre ici sous forme d'algo).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    NbErr=0
    AvantAppel :
    Appeler test.php?ID=1&FLAG=1
    SI "_OK" ALORS
       ToutVaBien
    SINON
       NbErr++
       SI NbErr <=3 ALORS
            GOTO AvantAppel
       FIN
       Afficher "Erreur !"
    FIN


    Maintenant, étudions les différents cas.

    J'appelle test.php?ID=1&FLAG=1 la première fois mais pour une raison inconnue (coupure de communication par exemple), je ne reçois pas le _OK
    (alors qu'il a marché, hein !). Le PDA va alors relancer le même script, qui va quant à lui échouer parce que l'enregistrement n'est pas modifié du tout.

    Or, dans ce cas là, ce n'est pas une erreur mais plutôt ce que j'appellerais un Warning.

    Appeler test.php?ID=TOTO&FLAG=1 est une erreur car TOTO n'existe pas dans la base.


    Voilà, en espérant avoir été un peu plus clair.

    Merci,

    Vincent

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Je me réponds à moi même. J'ai résolu le problème en ajoutant une clé de type sha1 dans ma table et je mets à jour ce champ lors de mon UPDATE.

    Merci à tous ceux qui se sont penchés sur mon problème.

    Vincent

  5. #5
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    C'est tres claire.
    je ne vois qu'une solution : un autre identifiant unique en attribut dans ta table que le pda connaitrait et enverrais.
    Si celui-ci existe aussi dans la base de données, l'update a deja été fait, il suffit de reprendre le flag. le cas echéant, faire l'update.
    Ceci implique un select avant le update.

    Z.

    [edit] thread ouvert trop longtemps, j'ai pas vu la réponse :p

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    J'avais bien déjà pensé à faire un SELECT avant mais honnêtement, je trouvais ça horrible. Ca rajoute 15 lignes de code (parce que je vérifiais que j'avais bien 1 enregistrement et pas plusieurs, etc... etc...). De plus, mon script étant censé être le plus rapide possible (il peut y avoir plusieurs dizaines de PDA connectés en même temps), ça me paraissait lourdingue.

    Ma solution avec la clé SAH1 me plait bien au final.

    Encore merci

    Vincent

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

Discussions similaires

  1. aide SVP concernant les types des erreurs
    Par nagca dans le forum Android
    Réponses: 4
    Dernier message: 22/04/2011, 11h10
  2. Redirection des erreurs des crons
    Par [root@127.0.0.1]~# dans le forum Linux
    Réponses: 2
    Dernier message: 18/04/2009, 04h38
  3. [FLEX] MenuBar: distinguer les items des menus
    Par alice.b dans le forum MXML
    Réponses: 0
    Dernier message: 15/04/2009, 16h21
  4. Distinguer les o des zéros
    Par white_angel_22 dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 23/09/2008, 14h00
  5. TQuery les exceptions des erreurs?
    Par delphino7 dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/03/2008, 11h49

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