Décrivez ici votre problème ou ce que vous cherchez à faire.
Bonjour tout le monde voilà, je cherche a faire tout simplement un minijeu dans lequel le joueur peut parier sur un numéro allant de 1 à 7, et a la fin du jeu , le numéro sur lequel les joueurs ont le moins parié gagne, exemple, si 2 personnes ont parier sur le numéro 5 et 4 personnes sur le numéro 1 alors le numéro 5 gagne.sauf que au moment de redistribuer les points aux vainqueurs, php leur en retire et ajoute des points a certains perdants , je sais pas ou se situe mon erreur , merci pour votre précieuse adire.

<?php

session_start();
echo "<pre>";
   print_r($_SESSION);
echo "</pre>";

echo "<pre>";
   print_r($_SESSION["adresse_mail"]);
echo "</pre>";

require_once 'connexion_base_de_donnees.php'; /*ici je procède a l'enregistrement du pari du client ainsi qu'a son adresse mail qui me permettra de l'identifier dans ma base de données*/

$req=$pdo->prepare ("INSERT INTO pariduclient SET adresse_mail= ?,position=?,mise=?");
$req->execute([$_SESSION["adresse_mail"],$_POST['position'],$_POST['mise']]);

$sel=$pdo->prepare("SELECT * FROM pariduclient WHERE position = ? and mise=?");/*ici je fais une requete pour afficher tous les joueurs ayant choisis le numéro 1 comme position et ayant misé la meme somme que moi, dans cet exemple la on supposera que la mise est de 200, puis je compte le nombre total que je meet dans la variable population1*/

$sel->setFetchMode(PDO::FETCH_ASSOC);
        $sel->execute (array(1,$_POST['mise']));
        $tab=$sel->fetchAll();
        echo "<pre>";
   print_r($tab);
echo "</pre>";
$population1=count($tab);
echo $population1;

$sel=$pdo->prepare("SELECT * FROM pariduclient WHERE position = ? and mise=?");/*ici je fais une requete pour afficher tous les joueurs ayant choisis le numéro 2 comme position et ayant misé la meme somme que moi, dans cet exemple la on supposera que la mise est de 200, puis je compte le nombre total que je meet dans la variable population2, et j'ai fait la meme chose jusqu'a la position 7*/
$sel->setFetchMode(PDO::FETCH_ASSOC);
        $sel->execute (array(2,$_POST['mise']));
        $tab=$sel->fetchAll();
        echo "<pre>";
   print_r($tab);
echo "</pre>";
$population2=count($tab);
echo $population2;

/*ici je crée un tableau associatif (tableau_des_populations) qui contiendra les nombres de parieurs pour chaque position , de la 1 jusqu'à la 7*/

$tableau_des_populations=[

1=>$population1,
2=>$population2,
3=>$population3,
4=>$population4,
5=>$population5,
6=>$population6,
7=>$population7,
];
echo "<pre>";
   print_r($tableau_des_populations);
echo "</pre>";

asort($tableau_des_populations);/*j'ai décidé que le numéro qui sera tiré au sort comme numéro gagnant sera celui sur lequel les parieurs auront le moins misé, exemple: si 2 personnes parient sur le numéro 5 et que 4 personnes parient sur le numéro 1, le numéro 5 sera donc le numéro gagnant, j'utilise donc la fonction asort afin de faire le tri du tableau en ordre croissant*/

echo "<pre>";
   print_r($tableau_des_populations);
echo "</pre>";

/*ici j'isole la première ligne de mon tableau précédemment trié puisque c'est elle qui contiendra en guise de clé le numéro gagnant et en guise de valeur le nombre de personnes ayant parié sur le dit numéro gagnant*/
$i = 0;
foreach($tableau_des_populations as $gagnant =>$nombre) {
  if($i==1) break;
  $i++;

echo( 'le numéro gagnant est le p_ '.$gagnant .'  valeur  '.$nombre );

echo( 'voici la liste des gagnants du pari de '.$_POST['mise']  );} /*ici j'affiche la liste des parieus ayant parié sur le numéro gagnant et ayant misé la meme somme que moi c'est a dire 200 dans notre exemple */

require_once 'connexion_base_de_donnees.php';

$sel=$pdo->prepare("SELECT adresse_mail FROM pariduclient WHERE position = ? and mise=?");
$sel->setFetchMode(PDO::FETCH_ASSOC);
        $sel->execute([$gagnant,$_POST['mise']]);
        $tab=$sel->fetchAll();
echo "<pre>";
   print_r($tab);
echo "</pre>";

require_once 'connexion_base_de_donnees.php'; /*voici là ou se situe mon problème, lorsque je veux redistribuer les gains,ici je fais une requete afin qu'une valeur de 200 soit ajouté a tous les gagnants et une valeur de 200 soit retiré a tous les perdants*/

$sel=$pdo->prepare("UPDATE pariduclient SET solde_du_compte= solde_du_compte+200 WHERE position = ? and mise=?");

$sel->execute([$gagnant,$_POST['mise']]);

require_once 'connexion_base_de_donnees.php';

$sel=$pdo->prepare("UPDATE pariduclient SET solde_du_compte= solde_du_compte-200 WHERE position != ? and mise =?");

$sel->execute([$gagnant,$_POST['mise']]); /*étrangement lorsque je fais un test dans lequel tous les parieurs ont joué une fois(ce qui veut dire que le numéro gagnant doit etre le numéro 1 et le solde du compte doit etre incrémenté de 200, ce n'est pas ce qu'il se passe c'est plutot le numéro 2 qui s'incrrémente de 200 et tous les autres numéros 1 compris se décrinmente de 200 , je vois vraiment pas ce qu'il se passe*/

Ce que je veux

Décrivez ce que vous cherchez à obtenir.

Ce que j'obtiens

Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

8 réponses


Hello, je commence juste à regarder mais :

/*ici j'isole la première ligne de mon tableau précédemment trié puisque c'est elle qui contiendra en guise de clé le numéro gagnant et en guise de valeur le nombre de personnes ayant parié sur le dit numéro gagnant*/
$i = 0;
foreach($tableau_des_populations as $gagnant =>$nombre) {
 if($i==1) break;
 $i++;

Pourquoi faire une boucle alors que tu cherches seulement la première ligne de ton tableau trié ? il me semble que tu te compliques la vie^^

De plus il n'est pas nécessaire de répéter l'instruction

require_once 'connexion_base_de_donnees.php';
$sel->execute([$gagnant,$_POST['mise']]); /*étrangement lorsque je fais un test dans lequel tous les parieurs ont joué une fois(ce qui veut dire que le numéro gagnant doit etre le numéro 1 et le solde du compte doit etre incrémenté de 200, ce n'est pas ce qu'il se passe c'est plutot le numéro 2 qui s'incrrémente de 200 et tous les autres numéros 1 compris se décrinmente de 200 , je vois vraiment pas ce qu'il se passe*/

Je me demande si le problème est pas lié à la variable $gagnant, cela fonctionne bien pour l'afficher dans ta boucle avec le echo pour annoncer la valeur et le gagnant, mais une fois que cela est affiché, la variable $gagnant va s'itérer une nouvelle fois et ne correspond plus au bon gagnant... certes sans conséquence puisque ton $i s'itère aussi et coupe la boucle avant d'afficher ce "second gagnant"... Mais en revanche ce faux gagnant reste stocké dans ta variable $gagnant et c'est lui qui est appelé dans ta requête ensuite....

je suis débutant et vraiment pas aussi habile que vous donc quel code pourrait résoudre ce probleme selon toi

et encore milles merci pour ton aide

Avec plaisir ! Tu pourrais essayer d'attribuer une nouvelle variable pour le gagnant dans ta boucle foreach, par exemple :

$vainqueur = $gagnant

Et tu utilises plutôt cette variable $vainqueur dans ta requête d'attribution des points ($gagnant sert juste à parcourir la boucle). Dis moi si ça fonctionne ;)

SA MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARCHE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! c'est incroyable meeeeeeeeeeeeeeeeeeeeeeeeeeerciiiiiiiiii JRCODE

mais tu disais que c'etait une affaire de mémoire , j'ai pas très bien compris le pourquoi de ce probème là, sa me sera très utile de savoir comment les choses fonctionnent afin d'éviter certaines erreurs plus tard

Supeeeeer !!!! Eh bien en fait dans cette boucle :

$i = 0;
foreach($tableau_des_populations as $gagnant =>$nombre) {
  if($i==1) break;
  $i++;
  echo( 'le numéro gagnant est le p_ '.$gagnant .'  valeur  '.$nombre );

Premier "bouclage" → $i = 0 donc pas de de break, et les instructions $i++ et echo s'éxecutent avec $vainqueur correspondant à ta première ligne de tableau
Deuxième "bouclage" (le break n'est pas encore exécuté) → $i = 1 donc break mais juste avant dans ton foreach $gagnant est passé à la deuxième ligne du tableau et même si le echo n'est pas exécuté cette fois c'est bien ce deuxième $gagnant qui est stocké en variable et est utilisé ensuite

En passant par une variable intermédiaire tu évites ce problème ;)

J'espère que c'est plus clair pour toi, ce genre de concept est pas toujours évident au début mais c'est la clé de beaucoup de choses en programmation ^^