Bonjour à tout le monde.

Je travaille sur un projet d'école qui est une application web qui permet de gérer des formations. (en gros).

J'ai quasiment fini le gros du travail, mais j'ai un problème sur le script qui permet aux utilisateurs de s'enregistrer à une formation.

Actuellement, les utilisateurs peuvent s'enregistrer s'il reste de la place à la formation définis par le formateur.

Le premier utilisateur qui s'enregistre à une formation ne pourra pas se ré-engistrer a la même formation, mais par contre, tous les autres utilisateurs, le deuxième ou le troisième pourront s'inscrit plusieurs fois à la même formation jusqu'à ce qu'il ne reste plus de place disponible.

Je n'arrive pas à comprendre pourquoi ma condition s'applique qu'une seule fois.

if(isset($_POST['parti']))
{
    $requ3 = $bdd->prepare("SELECT id_participant FROM inscription WHERE id_formation = ? ");
    $requ3->execute(array($mation['id']));

    $scription = $requ3->fetch();
    $requ3->closeCursor();

    if($_SESSION['id'] !== $scription['id_participant'])
    {            
        if($place_dispo > 0)
        {                              
            $req4 = $bdd->prepare('INSERT INTO inscription(id_formation, id_participant) VALUES(:id_formation, :id_participant)');
                $req4->execute(array(
                    'id_formation' => $mation['id'],
                    'id_participant' => $_SESSION['id'],
                ));

                echo '<p>tu es inscrit</p> ';                                        

                $delai = 2;
                header("Refresh: $delai;");                                  

        }else echo "Il n'y a plus de place disponible"; 
    }else echo '<p>tu es deja inscrit</p>';                          
 }

Donc le problème est : le deuxième utilisateur vient cliquer sur le bouton pour s'enregistrer, il reçoit le message "tu es inscrit" puis 2 seconds plus tard la page s'actualise et la variable $place_dispo diminue de 1, mais quand ce même utilisateur clique une nouvelle fois sur le bouton pour la même formation, il reçoit le message "tu es déjà inscrit" mais il est quand même rajouté a la base de données avec un refresh de la page 2 secondes plus tard avec une décrémentation de la variable $place_dispo

Merci beaucoup d'avoir pris le temps de lire mon problème et si vous avez d'autre question n'hésiter pas. :)

4 réponses


Sanruto7
Auteur
Réponse acceptée

Salut a tous, la solution a été trouvé, je la post si un jour ce problème peut-être évité pour d'autre ^^.

if(isset($_POST['parti']))
{
   $requ3 = $bdd->prepare("SELECT count(*) as 'nb' FROM inscription WHERE id_formation = ? and id_participant = ? ");
   $requ3->execute(array($mation['id'], $_SESSION['id']));

   $scription = $requ3->fetch();
   $requ3->closeCursor();

   if($scription['nb'] == 0 )
   {  
      if($place_dispo > 0)
      {                              
         $req4 = $bdd->prepare('INSERT INTO inscription(id_formation, id_participant) VALUES(:id_formation, :id_participant)');
         $req4->execute(array(
            'id_formation' => $mation['id'],
            'id_participant' => $_SESSION['id'],
         ));

         echo 'tu es inscrit';                                        

         $delai = 2;
         header("Refresh: $delai;"); 

      }else echo "Il n'y a plus de place disponible"; 
   }else echo 'tu es deja inscrit'; 
} 
Sanruto7
Auteur

Bonjour

Avec l'aide d'un membre d'open classroom qui m'a fait la réflexion que mon if regarde seulement la première ligne de ma requête et non tout le tableau je suis arrivé a ce script :

if(isset($_POST['parti']))
{
   $requ3 = $bdd->prepare("SELECT id_participant FROM inscription WHERE id_formation = ? ");
   $requ3->execute(array($mation['id']));

   $scription = array ($requ3->fetchAll());
   $requ3->closeCursor();

   foreach($scription as $element)
   {
      if(!in_array($_SESSION['id'], $element))/*($_SESSION['id'] !== $scription['id_participant']) ($_SESSION['id'] !== $element)*/
      { 
         if($place_dispo > 0)
         {                             
            $req4 = $bdd->prepare('INSERT INTO inscription(id_formation, id_participant) VALUES(:id_formation, :id_participant)');
            $req4->execute(array(
               'id_formation' => $mation['id'],
               'id_participant' => $_SESSION['id'],
            ));

            echo '<p>tu es inscrit</p> ';                                       

            $delai = 2;
            header("Refresh: $delai;");                                        
         }else echo "Il n'y a plus de place disponible";
      }echo 'tu es deja inscrit'; <br>   }                      
}

Mais le problème est toujours exactement le même a la différence que les messages " tu es inscrit" et "tu es deja inscrit" s'affiche tous les deux quelques soit le cas de figure. ^^

Es que quelqu'un aurai un conseil ou un voie qui me permettrai de continue ou bien savoir quoi chercher ?

Merci beaucoup

Bonjour,
Pour ce qui est du double affichage il me semble qu'il te manque un else avant ton echo.
Pour l'autre problème le contenu de $placeDispo est obtenu de quelle façon ?

Sanruto7
Auteur

Merci beaucoup à force d'ajouter et suprimer des choses j'avais meme pas vue le else en moins, merci ^^

Pour le $placeDispo, au début de mon code bien plus haut j'ai :

$requ = $bdd->prepare("SELECT * FROM formation WHERE id = ? ");
$requ->execute(array($id));

$mation = $requ->fetch();

$requ2 = $bdd->prepare("SELECT COUNT(id_participant) AS nbPartici FROM inscription WHERE id_formation = ? ");
$requ2->execute(array($mation['id']));

$decompte = $requ2->fetch();

$place_dispo = $mation['nbr_participant'] - $decompte['nbPartici'];