8768 sujets

Développement web côté serveur, CMS

Bonjour à toutes et à tous.
J'ai besoin d'un coup de main pour valider la méthode que je vais essayer de mettre en place pour résoudre le problème suivant.
Ce dont je dispose :
- un formulaire html avec une cinquantaine de lignes comportant chacune une "checkbox"
avec en "value" l'ID dans la base de données d'un certain nombre de balises "input" avec
des données "text". Chaque nom, "name" de ces balises, dans une ligne, est
suffixée par un nombre qui s'incrémente au passage d'une ligne à l'autre.
- une base de données dans laquelle un champ "cocher" existe dans chaque ligne et dont je
récupère l'ID.
- un fichier php qui fait les traitements voulus pour modifier la base de données en fonction
des actions sur les "checkbox" dans le formulaire.
À la première utilisation du formulaire aucune coche n'existe. Si une ou plusieurs "checkbox" sont cochées, les champs "cocher" dans la base de données sont bien mis à jour et l'attribut "checked" des "checkbox" est ajouté avec un brin de php, à l'ouverture suivante.
Le problème que je rencontre est que si je décoche certaines "checkbox", la base de données n'est pas mise à jour car l'attribut des "checkbox" n'est pas supprimé dans la ligne correspondante.
Sur le site dont je m'occupe je n'ai encore jamais utilisé de langage de script quel qu'il soit.
Donc, croyez-vous que ce que souhaite réaliser soit possible côté client? Si oui avec quel langage? Je ne demande pas que vous me proposiez du code mais seulement l'enchaînement des procédures.
Merci d'avance à celle ou celui qui m'aura lu jusqu'au bout et me répondra.
Michel.
Bonsoir Miflon,
peux-tu publier ton code php dans ton post pour que l'on t'aide plus facilement!?

Sinon pour surement simplifier ton code et éviter l'utilisation d'un attribut id :
-place la valeur de l'id dans l'attribut value de ta checkbox (il n'a pas forcément à être numérique)
-utilise un seul nom pour toute tes checkbox et fait le suivre de "[]" pour que la méthode GET ou POST (utilise POST c'est mieux) te ramène tous dans un tableau qui ne contiendra que les éléments "checked"

<form action="action_page.php" method="get">
  <input type="checkbox" name="apparence[]" value="1">Je suis blond<br>
  <input type="checkbox" name="apparence[]" value="2" checked>J'ai une moustache<br>
etc...
  <input type="submit" value="Submit">
</form>

Voilà ce que donne un echo var_dump($_GET) si les cases sont cochées;

array(1) { ["apparence"]=> array(2) { [0]=> string(1) "1" [1]=> string(3) "2" } }

si seulement la 2ème est cochée :
array(1) { ["apparence"]=> array(1) { [0]=> string(1) "2" } }

Sinon la façon dont tu procèdes est classique mais tu dois juste avoir un petit bug...et si tu publiais ton code on pourrait peut-être t'aider à mettre le doigt dessus

Bonne soirée,
GJboba
Merci à tous les deux pour la célérité de vos réponses.
Suite à la demande de GJboba voici la déclaration du formulaire :
<form id="formulaire" method="POST" action="../../../alva-inscriptions-ea-po.php">
<input 
  type="hidden" 
  name="prefix_base"
  value="<?php echo $wpdb->prefix; ?>" 
>

ensuite les deux premières lignes du tableau des données, la variable $i est mise à 0 avant l'entrée dans la partie HTML du formulaire et l'id de l'athlète, contenu dans "value" de la "checkbox" me sert à intervenir sur le champ "ath_cocher" :

  <table class="contact" style="width: 60%;">
    <thead>
      <tr>
        <th></th>
        <th>Licence</th>
        <th>Naissance</th>
        <th>Caté.</th>
        <th>Sexe</th>
        <th>Nom</th>
        <th>Prénom</th>
        <th>Club</th>
      </tr>
    </thead>
    <tbody>
        <?php foreach($jeunes as $jeune){ ?>
      <tr>
        <td>
          <input
            type="checkbox" 
            name="selectionner-<?php echo ++$i; ?>" 
            value="<?php echo $jeune->ath_id; ?>" 
        <?php if ($jeune->ath_cocher == 1 ) {echo 'checked';} ?> />
        </td>
        <td>
          <input 
            type="text"
            id="licence"
            name="licence-<?php echo $i; ?>" 
            size="8"
            value="<?php echo stripslashes( $jeune->Licence ); ?>" readonly />
          </td>
...
        </tr>
        <?php } ?>
    </tbody>
      <?php $imax = $i; ?>
  </table>
    <input
      type="hidden"
      name="imax"
      value="<?php echo $imax; ?>"
    >
    <input
      type="submit"
      value="Sauvegarder"
      name="sauvegarder"
    >
    <input
      type="submit"
      value="Terminer"
      name="terminer"
    >
</form>

Le bouton "Sauvegarder" enregistre les données, accumulées au fil de l'utilisation du formulaire pour inscrire des jeunes à une compétition, dans la base de données.
Le bouton "Terminer" créera un fichier excel puis remettra à 0 le champ "ath_cocher", pour pouvoir recommencer un cycle d'inscription.
Je vais essayer d'utiliser un tableau pour le "name" des balises "input".
Merci pour l'intérêt que vous portez à mon problème.
Michel.
Modifié par Miflon (12 Dec 2017 - 07:50)
Dans le code précédent, j'ai remplacé la ligne :
<input
  type="checkbox" 
  name="selectionner-<?php echo ++$i; ?>" 
  value="<?php echo $jeune->ath_id; ?>" 
  <?php if ($jeune->ath_cocher == 1 ) {echo 'checked';} ?> />

par
<input
  type="checkbox"
  name="selectionner[]"
  value="<?php echo $jeune->ath_id; ?>"
  <?php if ($jeune->ath_cocher == 1 ) {echo 'checked';} ?> />

Dans le fichier dont le nom est présent dans "action=" je récupère bien le tableau des lignes cochées "selectionner[]", comportant leurs id "ath_id". Je vais remettre à 0 la colonne "ath_cocher" dans toute la table avant de mettre à 1 les "ath_cocher" dans les lignes dont les id sont présents dans le tableau "selectionner[]".
Je vais essayer puis vous ferai part du résultat obtenu.
Michel.
Résultat : tout se passe comme je le souhaitais.
Dans le formulaire j'ai remplacé le "name" dans les "input" par name="xxxxxxxx[]"
Je récupère dans le fichier php de traitement des données les valeurs par $_POST['xxxxxxxx']
Je remets à 0 "ath_cocher" dans toute la table puis par
foreach( $cocher as $ids=>$id) {
    $requete = "UPDATE $nom_table_athletes SET ath_cocher = 1 WHERE ath_id = ?";
    $requete = $connexion->prepare($requete);
    $requete->bind_param('i', $id);
    $requete->execute();
    $requete->close();
  }

je mets à 1 le champ "ath_cocher" pour les tous les "ath_id" contenus dans $cocher = $_POST['selectionner']. Les nouvelles coches apparaissent bien et celles qui ont été décochées ne figurent plus.
Je vais maintenant m'attaquer à la création du fichier excel.
Merci pour votre aide, Michel.
Modifié par Miflon (12 Dec 2017 - 16:54)