Soucis avec une requête dans une boucle for

Résolu/Fermé
Speecial Messages postés 26 Date d'inscription mercredi 18 octobre 2017 Statut Membre Dernière intervention 16 avril 2020 - 18 oct. 2017 à 12:03
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 18 oct. 2017 à 16:34
Bonjour la communauté, je viens vers vous car j'ai un soucis dans mon code et rien à faire je n'arrive pas à le régler.

Je développe actuellement un jeu par navigateur ou les joueurs font pousser des fruits et légumes, les vendent sur le marché etc...

Ci-dessous je vous pose mon code, et en dessous je vous explique le soucis exact.


if($_POST['action'] == "1"){ 

  $req = $bdd->prepare('SELECT * FROM info_membre WHERE pseudo = ?');
      $req->execute(array($_SESSION['pseudo']));
      $infor = $req->fetch();

    $engrais_croissance_dispo = $infor['engrais_croissance'];

  $min_engrais = 0; 
  $max_engrais = 15; 
 
  for ($i = 0; $i < count($checked); $i++) { 
 
   $req = $bdd->prepare('SELECT engrais FROM culture_herbe WHERE id = ?'); 
   $req->execute(array($checked[$i])); 
   $check_plant = $req->fetch(); 
 
   $engrais_avant_arrosage = $check_plant['engrais']; 
   $engrais_ajout = $max_engrais - $engrais_avant_arrosage;
   $calcul_engrais_restant = $engrais_croissance_dispo - $engrais_ajout; 
   $calcul_engrais_apres_arrosage = $engrais_avant_arrosage + $engrais_ajout; 
 
   $sql = $bdd->prepare('UPDATE info_membre  
     SET engrais_croissance = :engrais_croissance  
     WHERE id = :id'); 
   $sql->execute(array('engrais_croissance' => $calcul_engrais_restant, 
                       'id' => $_SESSION['id'])); 
   $sql->closeCursor(); 
 
   $sql = $bdd->prepare('UPDATE culture_divers  
     SET engrais = :engrais  
     WHERE id = :id'); 
   $sql->execute(array('engrais' => $calcul_engrais_apres_arrosage, 
                       'id' => $checked[$i])); 
   $sql->closeCursor(); 
 
   echo "<br /> engrais avant arrosage ".$engrais_avant_arrosage." - "; 
   echo " engrais ajouté au plant ".$engrais_ajout."<br />"; 
 } 
  
} // fin de l'action engrais 



En fait je liste toutes les lignes de la table dans une boucle while, et j'assigne une checkbox à chacune pour pouvoir les arroser / engraisser via un formulaire.

Au niveau de l'arrosage ça se passe bien, j'obtiens ceci avec un echo.

engrais avant arrosage 12.5 - engrais ajouté au plant 2.5
engrais avant arrosage 10.3 - engrais ajouté au plant 4.7
engrais avant arrosage 9.2 - engrais ajouté au plant 5.8
engrais avant arrosage 5 - engrais ajouté au plant 10
engrais avant arrosage 10 - engrais ajouté au plant 5

utilisation d'engrais pour ces 5 plants 21.3 ml.

Sachant que la quantité maximum est 15 ml pour chaque plante.

En revanche ça foire au niveau de ma requête qui doit faire un update de l'engrais restant au joueur (table info_membre) .

Avant d'arroser ces 5 plants j'avais 40 ml d'engrais en stock.
et ayant utilisé 21.3 ml pour ces 5 plantes il devrait me rester 18.7 ml.
hors je me retrouve avec 35 ml d'engrais en stock.

Auriez vous une idée d'ou cela peut provenir ?

En vous remerciant pour vos réponses, Cdlt, Alex.
A voir également:

1 réponse

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
18 oct. 2017 à 16:34
Salut,

La mise à jour du stock d'engrais restant devrait être fait après ta boucle si j'ai bien compris ton code :
// avant la boucle, on initialise une variable permettant de calculer le total d'engrais ajouté
$total_engrais_ajout = 0;

for ($i = 0; $i < count($checked); $i++) { 
  [...]
  // dans la boule, on ajoute dans la variable total le nombre d'engrais ajouté pour une plante
  $engrais_ajout = $max_engrais - $engrais_avant_arrosage;
  $total_engrais_ajout += $engrais_ajout;
  [...]
}
// après la boucle, on met à jour le stock d'engrais de l'utilisateur
$calcul_engrais_restant = $engrais_croissance_dispo - $total_engrais_ajout; 

$sql = $bdd->prepare('UPDATE info_membre  
     SET engrais_croissance = :engrais_croissance  
     WHERE id = :id'); 
   $sql->execute(array('engrais_croissance' => $calcul_engrais_restant, 
                       'id' => $_SESSION['id']));


Bonne journée,
0