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 :

Gestion des présences via formulaire et checkbox vers une base de données [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut Gestion des présences via formulaire et checkbox vers une base de données
    Bonjour,

    Notre club de sport souhaite, pour la saison prochaine, faire évoluer sa prise de présence des joueurs de chaque catégorie. Actuellement, c'est une prise de présence via excell où ils cochent une case en fonction du nom et de la date. Certains entraîneurs ont parfois des soucis pour renvoyer le fichier depuis leur smartphone. Un espace sur notre site serait dédié aux entraîneurs avec login et mot de passe pour la prise des présences.

    J'ai pas mal codé pour mon site et usage perso sur la base de PHPBB il y a 16 ans passé, et jusqu'en 2015 et j'avoue que les notions ont peu à peu disparu depuis.

    Pour ces présences, j'ai créé une base de données intitulée 20222023, et une première table inscrits où on retrouve tous nos joueurs, leur nom, prénom, catégorie, date d'inscription, periode d essai, date de debut d'essai... et tout cela avec une clé id primaire avec auto-incrément.

    Voici ce à quoi j'ai pensé et travaille pour le moment en local :
    Pour le formulaire des présences de chaque catégorie, je vais chercher l'id du joueur, son nom, prénom et sa catégorie. Quelqu'un appelant la page U8 par exemple aura les joueurs .. U8.
    A côté de leur nom et prénom, figure une case à cocher pour dire s'ils sont présents à l'entrainement ce jour.
    Et c'est là que cela coince... je ne sais plus comment faire remonter les joueurs présents (et donc la ligne avec la case cochée) via le formulaire que je nommerai "action.php" pour le moment.
    La table où seront insérés chaque joueur s'appelle présence et reprend leur id, leur nom, prénom et la date de chaque entraînement où ils seront présents.

    Voici le code de la page "U8" actuel, qui reprend le SELECT de la table inscrits sur la base 20222023 et la création du formulaire :
    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
    22
    23
    24
    25
    // Create connection
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    // Check connection
    if (!$conn) {
      die("Connection failed: " . mysqli_connect_error());
    }
     
    $i = '0'; // compte les joueurs
    echo '<br /><hr>PRESENCES U8<br /><form name"u5u6" method="post" action ="action.php">';
     
    $sql = "SELECT id, categorie, nom, prenom FROM inscrits WHERE  categorie = 'U8' ORDER BY name ASC"; // sélectionne les joueurs selon leur nom ascendant.
    $result = mysqli_query($conn, $sql);
     
    if (mysqli_num_rows($result) > 0) {
      // output data of each row
      while($row = mysqli_fetch_assoc($result)) {
        $i=$i+1;
    	  echo $i . " -  " . $row["categorie"]. " ". $row["nom"]. " " . $row["prenom"]. "  <input type = \"checkbox\" name=\"presence\" id=\"".$row["nom"]."\" value=\"".$row["id"]."\"> <br />";	  
      }
    } else {
      echo "0 joueurs.";
    }
    echo "<input type = \"submit\"> 
    </form>";
    mysqli_close($conn);
    A partir d'ici, je reprends les données du formulaire comme je faisais avant mais cela bloque.. j'ai souvent fait des formulaires mais pas à choix multiples. Et j'ai des erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $id = isset($_POST['presence']) ? $_POST['presence'] : 'Pas de presence spécifié';
    $nom = isset($_POST['nom']) ? $_POST['nom'] : 'Pas de nom spécifié';
    $prenom = isset($_POST['prenom']) ? $_POST['prenom'] : 'Pas de prenom spécifié';
    Quelle serait la requête pour que chaque joueur coché soit enregistré dans la table presences avec son id, prénom, nom, et la date de l'entrainement ?
    Y aurait-il un autre moyen auquel je ne pense pas ?

    Le code n'est certainement pas optimisé mais je le ferai au fur et à mesure, je reprends ici quelques passages d'anciens codes utilisés.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Il faut générer des cases à cocher avec "[]" en fin de nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $Catégorie -- <label>$Nom, $Prénom (ID 123) <input type="checkbox" name="presences[]" value="123"></label>
    $Catégorie -- <label>$Nom, $Prénom (ID 234) <input type="checkbox" name="presences[]" value="234"></label>
    $Catégorie -- <label>$Nom, $Prénom (ID 345) <input type="checkbox" name="presences[]" value="345"></label>
    Ensuite dans le script traitant le formulaire, tu obtiendras un tableau $_POST['presences'] contenant le VALUE des cases cochées, et donc l'ID des joueurs présents.

  3. #3
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut
    D'accord, merci, avec cela, j'ai déjà pu faire afficher l'id des joueurs en tableau via un echo et foreach.

    Ensuite, j'ai créé ma requete en boucle tant qu'il y a des valeurs id de cette façon :
    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
     
    // on teste si le visiteur a soumis le formulaire
     
    if (isset($_POST['presence'])) {
     
    	if(is_array($id)){
        	     foreach ($id as $row) {
            	$sql = "INSERT INTO `presence_U6` (`date_entrainement`) VALUES ($row)" ;
    			$req = mysqli_query($conn, $sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error($conn));
    			$i=$i+1;
       			}
    		}
    	echo $i . ' ';
    	exit();
    	}

  4. #4
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut
    Jusqu'ici, tout est ok, mais maintenant, on me demande s'il est possible de marquer les joueurs non cochés, comme absents.

    Pour le moment, la requête insère x nouveaux enregistrements dans une table appelée "présence", les x nouveaux enregistrements sont le nombre de cases cochées. Les non cochés sont ignorés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(is_array($id))
    {
     	foreach ($id as $idjoueur) 
    	{
           		$sql = "INSERT INTO $presence_table (`id_joueur`, `date_entrainement`) VALUES ($idjoueur, '$datum')" ;
    		$req = mysqli_query($conn, $sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error($conn));
    		$i=$i+1;
       	}
    }
    Comment pourrais-je faire ?
    Y a t-il un moyen de détecter les champs non cochés (je ne pense pas) ?
    Si je crée une colonne "present" avec une valeur par défaut de 0, et que dans la requête actuelle, je passe à 1 pour chaque checkbox cochée, ceux non cochés resteront à 0, mais comment puis-je créer les enregistrements des non cochés ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(is_array($id))
    {
     	foreach ($id as $idjoueur) 
    	{
           		$sql = "INSERT INTO $presence_table (`id_joueur`, `present`, `date_entrainement`) VALUES ($idjoueur, 1,  '$datum')" ;
    		$req = mysqli_query($conn, $sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error($conn));
    		$i=$i+1;
       	}
    }
    J'avais pensé à une requête supplémentaire après enregistrement mais, je ne trouve pas le moyen d'ajouter la condition WHERE NOT idjoueur = 'x' AND NOT idjoueur = 'y' et cela répété autant de fois qu'il y a de joueurs cochés, car une fois, il y aura 12 joueurs cochés, une autre fois, peut etre 10...

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Les cases à cocher servent à marquer la présence d'une propriété, pas son absence => Une case à cocher non cochée n'existe pas après soumission du formulaire

    Deux possibilités :

    Possibilité 1. -- La propre : on utilise le type d'entrée de formulaire adapté pour définir 1 état parmi un choix (ici "Absent" ou "Présent")

    => Bouton radio ou menu select

    Avec le bouton radio la difficulté est que le NAME doit être identique au sein d'un même groupe de boutons, ça donnerait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?= $nom ?>, <?= $prénom ?> (ID <?= $id ?>) 
    <label><input type="radio" name="presences[<?= $id ?>]" value="1"> Présent</label>
    <label><input type="radio" name="presences[<?= $id ?>]" value="0"> Absent</label>
    ...
    Même principe pour le select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?= $nom ?>, <?= $prénom ?> (ID <?= $id ?>)
    <select name="presences[<?= $id ?>]">
        <option value="1">Présent</option>
        <option value="0">Absent</option>
    </select>
    Possibilité 2. -- Une moins propre (dans le sens où on contourne le paradigme classique), mais qui a l'avantage de la simplicité apparente des cases à cocher

    Tu génères 1 champ HIDDEN pour chaque joueur attendu à l'entrainement

    Dans le script PHP de traitement, pour chaque joueur attendu :
    Si la case est cochée (et donc présente) => Il était présent
    Si la case à cocher est absente => Il était absent

    Les champs HIDDEN pourraient être de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <input type="hidden" name="joueurs_attendus[]" value="123">
    <input type="hidden" name="joueurs_attendus[]" value="234">
    <input type="hidden" name="joueurs_attendus[]" value="345">
    ...

  6. #6
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut
    J'ai pensé à la solution 2, avec des hidden. Mais je ne sais plus comment générer la requête d'insertion...
    Côté formulaire :
    value = id du joueur dans la table "inscrits" que je fais remonter pour la requete d'insertion.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <tr><td align="right">  <input type = "hidden" name="attendu[]" id="attendu" value="48">  </td><td>Dupont Jean</td></tr>
    <tr><td align="right">  <input type = "hidden" name="attendu[]" id="attendu" value="49">  </td><td>Leclerc Loic</td></tr>
    ...
    <tr><td align="right">  <input type = "checkbox" name="presence[]" id="presence" value="48">  </td><td>Dupont Jean</td></tr>
    <tr><td align="right">  <input type = "checkbox" name="presence[]" id="presence" value="49">  </td><td>Leclerc Loic</td></tr>
    Côté envoi, je ne vois pas comment modifier la requete.
    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
     
    $datum =  isset($_POST['date']) ? $_POST['date'] : '2022-05-24';  // si je n'ai pas de date encodée, date defaut 
    $id = isset($_POST['presence']) ? $_POST['presence'] : 'Pas de joueur spécifié';
    if (empty($datum))
    		{
       			$datum = date('Y-m-d'); // date d'aujourd'hui si on n'a pas mis de date
    		}
    		if (isset($_POST['presence'])) // enregistre  si il y a une présence encodée
    		{
    			if(is_array($id))
    			{
        			foreach ($id as $idjoueur) // pour chaque joueur, on crée un enregistrement avec son id, la date et la présence mise à 1
    				{
            			$sql = "INSERT INTO $presence_table (`id_joueur`, `date_entrainement`, `present`) VALUES ($idjoueur, '$datum', 1)" ;
    					$req = mysqli_query($conn, $sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error($conn));
    					$i=$i+1;
       				}
    			}
    		}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Copier des données d'un formulaire vers une base de données
    Par pifou031 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/06/2019, 21h30
  2. Exporter des données vers une base de données Oracle
    Par sellamelie dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/08/2009, 16h07
  3. Réponses: 4
    Dernier message: 15/05/2009, 13h29
  4. Réponses: 1
    Dernier message: 08/01/2008, 14h20
  5. Réponses: 1
    Dernier message: 29/08/2006, 17h03

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