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 :

La fonction Update, un mystère


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut La fonction Update, un mystère
    Bonjour à tous,
    il se passe 2 mystères intimement liés dans ma ptite programmation ...

    1) Je souhaite mettre a jour dans ma base de données un score de vote tout simple en ajoutant 5 points. Voilà la ligne de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("UPDATE table SET scorevote = scorevote+5 WHERE pseudo='$pseudo'");
    Il se produit donc une modification dans le champs concerné et ajoute ces 5 points, mais le plus souvent 10 points d'un coup ... gros problème et surtout POURQUOI!!

    2) Sur cette même page, comme on ne doit voter qu'une seule fois par jour, un champs "voteactif" est présent dans la bdd. Voilà la ligne de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    "SELECT voteactif FROM table WHERE pseudo='$pseudo'"
    if (voteactif == 0) ON PEUT VOTER
    else ON PEUT PLUS VOTER
     
    PUIS
     
    mysql_query("UPDATE table SET voteactif == 1 WHERE pseudo='$pseudo'");
    Si on a déjà voté, un message d'erreur apparait. Mais j'ai l'impression que DES FOIS SEULEMENT, l'UPDATE est traité avant l'affichage du vote, donc le client ne peut pas effectuer son vote puisqu'il est considéré comme déjà avoir voté ...

    C'est plus une épine que j'ai dans le pied mais un acacia centenaire ... merci du coup de main.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,

    Je ne sais pas si c'est réellement le cas, mais appeler une table "table", c'est une mauvaise idée, vu que c'est un mot réservé du SQL...
    Sinon, le premier problème doit provenir du code autour de ton update, et non pas directement de l'update lui-même. Je penche plutôt pour un problème de code PHP...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Merci de ton coup de main ced,
    la table ne se nomme pas comme cela en vrai, c'est pour clarifier le code ... je vais revoir mon code php, et éventuellement le poster, mais c'est bizarre que des fois ça ajoute la bonne valeur, et des fois le double ... comme si l'information était lue 2 fois.
    Si y'a d'autres propositions je prends, et merci encore.

  4. #4
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut toujours bloqué
    Grrrrr, j'suis toujours bloqué, et pas moyen d'en sortir, ce problème est identique, mais un peu plus simple à expliquer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    session_start();
    $pseudo = $_SESSION['pseudo'];
    $motdepasse = $_SESSION['motdepasse'];
     
     
    $db = mysql_connect('...', '...', '...')  or die('Erreur de connexion '.mysql_error());
    mysql_select_db('...',$db)  or die('Erreur de selection '.mysql_error());
    mysql_query("UPDATE test SET nbvote = nbvote - 1 WHERE pseudo='$pseudo'");
    mysql_close();
    ?>
    Je fais un include de cette page de façon à décrémenter les votes quotidiens limités à 3. Au premier vote, on passe normalement à "2 votes restants", au second on passe à "1 vote restant" et au troisième "plus de vote possible". Mais dès fois ça décrémente de -2 au lieu de -1 et d'autres fois ça fonctionne nickel ... j'comprends rien ... si quelqu'un peut me donner un ptit coup de pouce ou un grand coup de pied ... merci beaucoup.

  5. #5
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    Vu comme celà, les requêtes sont bonnes

    Comme Ced, je dirais que c plus un problème dans ton code php ....

    Si par exemple, il décrémente de 2 au lieu de 1, ya surêment deux fois l'appel à cette requête (pour être s^r, places des echo comme étapes dans ton programme)

  6. #6
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Salut et merci du coup de main,
    si j'enlève cette page en supprimant l'include, il ne se produit aucune décrémentation, et dans la page qui appelle cet include, il n'y a que très peu de php ... donc pas de doublette possible ... d'autant plus que des fois la décrémentation se produit nickel ...
    J'ai vu sur certains forum que cela pouvait venir de l'hébergeur ... j'trouve ça bizarre.

  7. #7
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Oui, j'espère ne pas avoir le même hébergeur

    As tu fais un echo pour être sûr de ne pas avoir deux fois la requête (même si tu es sûr).

  8. #8
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Héhé j'te le souhaite aussi ...
    J'utilise déjà la fonction echo pour citer le résultat sur ma page ... et aussi essayé d'incrémenter de 1 pour voir comment ça réagit, et il se produit la même chose, des fois ça incrémente de +2 et des fois +1. HAAAAAAAAAAAAAAAAAAAA
    Ptêt ben que mon clavier va perdre malencontreusement quelques touches après un choc non prémédité sur un angle de mur

    En tout cas merci encore d'essayer de me dépanner

  9. #9
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Par défaut
    Salutations,
    pour ton code, je crois qu'il faut ajouter des parenthèses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("UPDATE table SET scorevote = (scorevote+5) WHERE pseudo='$pseudo'");

    dans cette partie de code, on vérifie si le valeur du voteactif == 0, si oui, il faut réctifié et ajouter 1, donc tu dois modifier ton code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    "SELECT voteactif FROM table WHERE pseudo='$pseudo'"
    if (voteactif == 0) ON PEUT VOTER
    puis
    mysql_query("UPDATE table SET voteactif == 1 WHERE pseudo='$pseudo'");
     
    else ON PEUT PLUS VOTER

  10. #10
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Salut ottoayoub, et merci de ton coup de main,
    - pour ce qui est des parenthèses, je viens de tester, et ça ne change rien.
    - pour la seconde partie, tu as parfaitement raison, mais du coup entre temps j'ai un peu changé la structure de mes requètes, et on en revient à ce problème là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    session_start();
    $pseudo = $_SESSION['pseudo'];
    $motdepasse = $_SESSION['motdepasse'];
     
     
    $db = mysql_connect('...', '...', '...')  or die('Erreur de connexion '.mysql_error());
    mysql_select_db('...',$db)  or die('Erreur de selection '.mysql_error());
    mysql_query("UPDATE test SET nbvote = nbvote - 1 WHERE pseudo='$pseudo'");
    mysql_close();
    ?>
    où la décrémentation de -1 à chaque vote est très mystèrieuse, en faisant de temps en temps -1 et d'autre fois -2 alors qu'il n'y a pas de doublons.
    Je vais essayer ce code sur du super simple c'est une bonne idée Fench.

    Merci à vous 2 du coup de main, si y'a des propositions, je prends touuuut.

  11. #11
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Par défaut
    Bonsoir,
    Voilà tu testes cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("UPDATE test SET nbvote = ('$nbvote')-1 WHERE pseudo='$pseudo'");
    remplace aussi dans ta première requête $scorevote par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("UPDATE table SET scorevote = ('$scorevote')+5 WHERE pseudo='$pseudo'");

  12. #12
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Merci à toi ottayoub, mais ça ne fonctionne encore pas ...
    J'ai testé comme tu me l'as conseillé Fench, et arrive à faire fonctionner ma décrémentation de 1 en 1 avec le script simpliste que je vais mettre en fin de post.
    Mais dès que je réintègre ce code dans mon script original, pas moyen, même en en faisant un include où ça ne devrait rien changer, on décrémente de 2 en 2 et des fois de 1 par je ne sais quel hasard.

    Page decrementation.php
    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
     
    <?php
    session_start();
    $pseudo = ...;
    $motdepasse = ...;
     
    $db = mysql_connect('...', '...', '...')  or die('Erreur de connexion '.mysql_error());
    mysql_select_db('...',$db)  or die('Erreur de selection '.mysql_error());
     
     
    $sql = "SELECT nbvote FROM test WHERE pseudo='$pseudo'"; 
     
    // on met les selections en variable
    $res = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    $data = mysql_fetch_array($res);
    ?>
     
    <p>- Bienvenue dans ton espace <?php echo $pseudo; ?> -
    - Il te reste <?php echo $data['nbvote']; ?> vote(s) -
    <a href="http://www......miseajour.php">-lien-</a>
    </p>
    Page miseajour.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    session_start(); 
    $pseudo = ...;
    $motdepasse = ...;
     
    $db = mysql_connect('...', '...', '...')  or die('Erreur de connexion '.mysql_error());
    mysql_select_db('...',$db)  or die('Erreur de selection '.mysql_error());
    mysql_query("UPDATE test SET nbvote = nbvote-1 WHERE pseudo='$pseudo'");
    mysql_close();
    ?>
    Merci au warrior qui va m'aider parce que mon clavier est tout glissant à force que j'le mordille comme un jeune labrador

  13. #13
    Membre confirmé
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Par défaut
    Si tu permets, je reviens sur ce point avec une petite idée. Pourquoi ne pas récupérer le nombre de vote avant le traitement de la mise à jour, vérifier s'il est égal à 0, si oui on met à jour la base de données, bref tu fais ton traitement, exemple:

    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
     
    <?php
    $recuperation_nombre_vote = "Select scorevote from maTable where pseudo = `$pseudo`";
    $resultat = mysql_query($recuperation_nombre_vote) or die(mysql_erro());
    while($enregistrement = mysql_fetch_assoc($resultat)){
     
    		$nb = $enregistrement['scorevote'];
     
    	}
    if($nb == 0){// je peux voter
    $maj = "update maTable set scorevote = (`$nb`)+1 where pseudo = `$pseudo`";
    } else{
    // Je ne peux pas voter
    }
    ?>
    Voilà, je crois que c'est plus simple et plus pratique

  14. #14
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    @ottoayoub
    Il me semble que scorevote et voteactif($nb) ne sont pas copains ...
    voteactif est un flag sur le jour (0 ou 1) pour voter qu'ine seule fois
    scorevote est un entier de 0 à xxx qui suivra l'utilisateur pour tous ses votes

  15. #15
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    Bonjour a vous,
    Je viens d'essayer d'adapter ton code ottoayoub, en ajoutant des else if a la fin pour chaque possibilité, sachant que l'on a droit à 3 votes quotidiens.

    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
    <?php
    $recuperation_nombre_vote = "Select nbvote from maTable where pseudo = `$pseudo`";
    $resultat = mysql_query($recuperation_nombre_vote) or die(mysql_erro());
    while($enregistrement = mysql_fetch_assoc($resultat)){
     
    		$nb = $enregistrement['nbvote'];
     
    	}
    if($nb == 3){// je peux voter
    $maj = "update maTable set nbvote = '2' where pseudo = `$pseudo`";
    } 
    else if($nb == 2){// je peux voter
    $maj = "update maTable set nbvote = '1' where pseudo = `$pseudo`";
    }
    else if($nb == 1){// je peux voter
    $maj = "update maTable set nbvote = '0' where pseudo = `$pseudo`";
    }
    else{
    // Je ne peux plus voter
    }
    ?>
    Le code parait bon pourtant on passe de 3 à 1 et de 1 à 0, comme si mysql allait trop vite et lisait le 'if' et le 'else if' d'un coup ...
    Merci beaucoup d'essayer de m'aider en tout cas c'est super sympa

  16. #16
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Si tu gardes ce code, j'aurais plutôt écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if($nb > 1){
    // je peux voter
    $nb--;
    $maj = "update maTable set nbvote = '$nb' where pseudo = `$pseudo`";
    } 
    else{
    // Je ne peux plus voter
    même sur ma syntaxe des Updates que j'utilise pour mes sites:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $maj = "update maTable set nbvote = '".--$nb."' where pseudo = `".$pseudo."`";

  17. #17
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Par défaut
    rolalaaaaaa c'est un truc de folie !! ça me fait passer directement de 3 votes à 0 ...

    Je crois que je vais repartir sur ton idée de base Fench, le ptit code simpliste fonctionne alors j'vais essayer de rebâtir dessus ...
    Ce qui est terrible c'est que quand j'en fais un include, ça ne fonctionne plus, et quand je l'utilise a part, ça fonctionne ...

    PS : j'ai maintenant besoin d'un clavier tellement j'ai machouillé le mien

Discussions similaires

  1. erreur dans la fonction update (en asp)
    Par leclone dans le forum ASP
    Réponses: 1
    Dernier message: 26/05/2006, 10h00
  2. Fonction UPDATE dans un ADOQuery - SQL
    Par yanba dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/03/2006, 13h53
  3. Problème fonction UPDATE
    Par Mael Bo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/02/2006, 15h54
  4. astuce avec fonction update
    Par cubepiege dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/11/2005, 10h54
  5. [Update TQuery]Lenteur de la fonction Update
    Par Eric SAULNIER dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2004, 01h29

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