Bug incompréhensible !!???

Bug incompréhensible !!??? - PHP - Programmation

Marsh Posté le 15-06-2008 à 01:05:59    

SAlut,
 
J'ai étébli ce script pour établir une note moyenne sur 5 en fonction des votes :

Code :
  1. <?php
  2. bloc_head("Noter un logiciel" );
  3. $note="$_POST[note]";
  4. $req1=reqmysql("SELECT * FROM archives where archives . id=$id" );
  5. $ligne1=mysql_fetch_array($req1);
  6.         $vote=$ligne1['vote'];
  7.         $points=$ligne1['points'];
  8.         $vote=$vote +1;
  9.         $newpoints =$points +$note ;
  10.         $newnotem =$newpoints /$vote ;
  11.         $newstars =ceil($newnotem) ;
  12.         $newnotem =substr($newnotem ,0,3);
  13.        
  14.        
  15. $req2 =reqmysql("UPDATE archives SET vote='".$vote."', points='".$newpoints ."', notem='".$newnotem ."',
  16. stars='".$newstars."' where id=".$id ." limit 1" );
  17. echo"
  18. <p align=center>
  19. Vote comptabilisé, la nouvelle note de ce fichier est maintenant de $newnotem<br /><br />
  20. <a href=index.php?mod=archives&amp;ac=voir&amp;id=$id>Retour</a>
  21. </p>
  22. ";
  23. close_table();
  24. ?>


 
Le gros problème c'est que $vote qui est le nombre de votes monte de 1 ou de 2 de manière complètemenat aléatoire. Des fois il se prend normalement +1 et des fois il se prend +2 de manière totalement incompréhensible !!!!
Là faut m'expliquer...


Message édité par ti-bank le 15-06-2008 à 02:17:04

---------------
Tous vos programmes & cours pour calculatrices TI : www.ti-bank.fr
Reply

Marsh Posté le 15-06-2008 à 01:05:59   

Reply

Marsh Posté le 15-06-2008 à 03:27:26    

salut !
 
Quelques petits probleme de base déjà :
 
ligne 7 : $note = $_POST['note'] suffit (toujours mettre des quotes, sinon ta clé est considéré comme constante
 
ligne 9 : vu les champs que tu recuperes dans ton script, évite les select * :  
"SELECT vote, points FROM ..." fera largement l'affaire
 
ligne 9 : ton $id tu le sors d'où ? mets les register_globals à Off !
 
ligne 14 : $vote++ c'est plus propre
 
ligne 22 : pour tout champ numérique, inutile de mettre des quotes à tout va
ligne 23 : limit 1 ne sert à rien pour un update
 
pour vérifier ta requete, procede plutot ainsi :
$ma_requete = "SELECT ..."
reqmysql($ma_requete)
afin de voir exactement les valeurs mises à jour
 
pour ta question, ton script n'est pas censé faire un "+2" sur le nb de vote, mis à part rafraichir 1x la page  
 
 
Voilou :)


Message édité par Profil supprimé le 15-06-2008 à 03:28:28
Reply

Marsh Posté le 15-06-2008 à 13:45:36    

Merci pour tes réponses !
Il rafraîchit une fois la page ? Le bug semble se produire uniquement avec Mozilla ?
Comment y remédier ?
J'ai déjà tout corrigé avec tous tes conseils.
Mais avec ++ au lieu de +1, le nombre de votes n'augmente plus....


---------------
Tous vos programmes & cours pour calculatrices TI : www.ti-bank.fr
Reply

Marsh Posté le 15-06-2008 à 14:47:01    

une dernier petite remarque d'optimisation : je te conseillerais d'utiliser mysql_fetch_assoc plutot que mysql_fetch_array qui te renvoie numérique et associatif. Fais un :
 

Code :
  1. echo "<pre>";
  2. print_r($ligne1);
  3. echo "</pre>";


tu verras ....
 
les écritures $vote++ ou $vote+=1; ou $vote=$vote+1 sont completement identiques.  
Si tu veux t'en assurer fais un echo avant et apres ...
 
Tes données sont lu dans une table, donc avant de faire quoi que ce soit, fais un print_r($ligne1) ce que tu manipules comme données.
 
Puis apres, sotckes ta requete update dans une variable, afiche la et execute ta requete à partir de ta variable, comme ca tu sais exactement ce que tu recupere et ce que tu mets à jour.
 
Bref, passes en mode debuggage

Reply

Marsh Posté le 20-06-2008 à 14:43:13    

en gros je dirait que la moitié de ton code est plus ou moins inutile, il y a possibilité de remplacé les ligne 9 à 23 par ça :
mysql_query( "UPDATE archives SET vote=(vote+1), points=(points+".$note." );" );

 

Je suis pas certains de la syntaxe mais ça doit s'en rapprocher

 

ton premier select ne sert à rien, tu peux très bien faire les calculs dans la requête

 

ensuite, l'intérêt de sauvegarder une note moyenne est pas évident, étant donné que c'est une valeur calculée à partir de données en base, tu pourra le calculer via le php à l'affichage, c'est pour celà que je ne les ai pas inclu dans la requête d'update.

 

après c'est un choix, mais généralement tous ce qui peux être calculé simplement, j'évite de le mettre en base.

 

ça donnerais à peu près ça :

Code :
  1. $note="$_POST[note]";
  2. mysql_query( "UPDATE archives SET vote=(vote+1), points=(points+".$note." ) where id=".$id.";" );
  3. $req1=reqmysql("SELECT * FROM archives where archives . id=$id" );
  4. $ligne1=mysql_fetch_array($req1);
  5. <p align=center>
  6. Vote comptabilisé, la nouvelle note de ce fichier est maintenant de ".($ligne1['point']/$ligne1['vote'])."<br /><br />
  7. <a href=index.php?mod=archives&amp;ac=voir&amp;id=$id>Retour</a>
  8. </p>
 

je décline toute responsabilité en cas d'erreur, je n'ai pas testé :o

Message cité 1 fois
Message édité par gugus le 20-06-2008 à 14:43:55
Reply

Marsh Posté le 21-06-2008 à 03:50:03    

gugus a écrit :

en gros je dirait que la moitié de ton code est plus ou moins inutile, il y a possibilité de remplacé les ligne 9 à 23 par ça :
mysql_query( "UPDATE archives SET vote=(vote+1), points=(points+".$note." );" );
 
Je suis pas certains de la syntaxe mais ça doit s'en rapprocher
 
ton premier select ne sert à rien, tu peux très bien faire les calculs dans la requête
 
ensuite, l'intérêt de sauvegarder une note moyenne est pas évident, étant donné que c'est une valeur calculée à partir de données en base, tu pourra le calculer via le php à l'affichage, c'est pour celà que je ne les ai pas inclu dans la requête d'update.
 
après c'est un choix, mais généralement tous ce qui peux être calculé simplement, j'évite de le mettre en base.
 
ça donnerais à peu près ça :

Code :
  1. $note="$_POST[note]";
  2. mysql_query( "UPDATE archives SET vote=(vote+1), points=(points+".$note." ) where id=".$id.";" );
  3. $req1=reqmysql("SELECT * FROM archives where archives . id=$id" );
  4. $ligne1=mysql_fetch_array($req1);
  5. <p align=center>
  6. Vote comptabilisé, la nouvelle note de ce fichier est maintenant de ".($ligne1['point']/$ligne1['vote'])."<br /><br />
  7. <a href=index.php?mod=archives&amp;ac=voir&amp;id=$id>Retour</a>
  8. </p>


 
je décline toute responsabilité en cas d'erreur, je n'ai pas testé :o


Ta responsabilité civile sera engagée en cas de retard sur la recette :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed