Mettre a jour table mysql temporaire avec checkbox

Résolu/Fermé
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020 - Modifié le 23 févr. 2018 à 16:20
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020 - 24 févr. 2018 à 19:01
Bonjour,
Dans le but de sélectionner les participants à une action de mon association, je crée une table temporaire à partir de la table des adhérents. Cette table contient un champ Selection qui devrait être mis à jour à l'aide d'un formulaire contenant une checkbox. Ensuite, je crée une table définitive en sélectionnant les lignes cochées.
La création de la table temporaire ne pose pas de problèmes. En revanche, la mise a jour de cette table ne semble pas fonctionner, dans la mesure où la table définitive reprend l'ensemble des adhérents, cochés ou non.
Voici mon code :
<?php
  //Connexion à la base de données
                //on crée une table temporaire permettant de sélectionner les participants à une formation
  
  $sql = 'CREATE TEMPORARY TABLE ce_copie SELECT * FROM ce';
  $bdd->exec($sql);
 
  //on affiche la liste des adhérents permettant de cocher les participants
  ?>
  <h3>Liste des adhérents</h3>
  <form action="ParticipantsFormations.php" method="POST">
   <table>
    <tr>
     <th>Index_ce</th>
     <th>Nom</th>
     <th>Prenom</th>
     <th>Courriel</th>
     <th>Selection</th>
    </tr> 
   
  <?php
  $sql2 = 'SELECT * FROM ce_copie ORDER BY Nom';
  
  foreach ($bdd->query($sql2) as $row)
   {
   ?>
   <tr>
    <td> <input name="Index_ce[]" type="texte" value="<?php echo $row['Index_ce']; ?>" </td>
    <td> <input name="Nom[]" type="texte" value="<?php echo $row['Nom']; ?>" </td>
    <td> <input name="Prenom[]" type="texte" value="<?php echo $row['Prenom']; ?>" </td>
    <td> <input name="Courriel[]" type="texte" value="<?php echo $row['Courriel']; ?>" </td>
    <td> <input name="Selection[]" type="checkbox"</td>
   </tr> 
   <?php
   }
   ?>
   </table>
  <br>
  
<!-- On met à jour la table "ce_copie" pour pouvoir sélectionner les ce inscrits-->   
  <input type="submit" name="updateur" value="Sélectionner">
  </form>
   <br>
 
  <?php 
 print_r($_POST['Selection']);  //affichage si trois lignes cochées: Array ( [0] => on [1] => on [2] => on )
 
 print_r($selection=(!empty($_POST['Selection']) ? 1 : 0));  //affichage : 1
 
 
 $update = $bdd -> prepare('UPDATE ce_copie SET Selection = :selection');
 foreach(explode($selection) as $selections)
 {
  $update -> execute(array('selection' => $selections));
 }
  
//créer la table définitive des inscrits

  $participants =  'CREATE TABLE Formation20mai2018 SELECT * FROM ce_copie WHERE Selection = 1';
  $bdd -> exec($participants);

//affichage des inscrits :   
  $sql3 = 'SELECT * FROM  Formation20mai2018 ORDER BY Nom';
 ?>
  
  <table>
    <tr>
     <th>Index_ce</th>
     <th>Nom</th>
     <th>Prenom</th>
     <th>Courriel</th>
     <th>Selection</th>
    </tr> 
    
 <?php
 
 
  foreach($bdd->query($sql3) as $row3)
   {
   ?>
   <tr>
    <td> <?php echo $row3['Index_ce']; ?> </td>
    <td> <?php echo $row3['Nom']; ?> </td>
    <td> <?php echo $row3['Prenom']; ?> </td>
    <td> <?php echo $row3['Courriel']; ?> </td>
    <td> <?php echo $row3['Selection']; ?> </td>
   </tr> 
   <?php
   }
  
   ?>
   </table>
  <br>
  <?php 
  


EDIT : Correction des balises de code

Je pense que s'est dans la mise à jour de la table temporaire que se situe l'erreur. Merci par avance à celles ou ceux qui voudront bien s'intéresser à mon problème.
Christian
A voir également:

2 réponses

yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 23 févr. 2018 à 19:54
bonsoir, j'ai l'impression que ton formulaire comporte des champs "input" superflus: il me semble que Index_ce[] et Selection[] suffisent amplement.
je traiterais la réponse ainsi:
$update = $bdd -> prepare('UPDATE ce_copie SET Selection = true WHERE Index_ce = :index ');
$selections = $_POST['Selection'];
$indexes = $_POST['Index_ce'];
foreach ($selections as $cle=>$selection){
    if ($selection){
         $index = $indexes[$cle];
         $update -> execute(array('index' => $index));
    }
} 
et je suppose que le champ Selection est partout faux dans la table ce.
1
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
23 févr. 2018 à 20:30
Bonsoir,

Et au passage ... vu que tu sembles travailler en PDO ... il faut que tu actives la gestion des erreurs PDO et que tu places CHAQUE requête dans un bloc TRY/CATCH
Voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

.
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
23 févr. 2018 à 21:22
Bonsoir Jordane,
S'agissant d'une table temporaire, elle n'apparait pas dans phpMyAdmin. Comment faire en manuel?
Pour les try/catch, ok...
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
23 févr. 2018 à 21:38
Bonsoir yg_be,
Dans mon idée, le champ sélection est vide dans la table ce_copie avant sa mise à jour, il prend la valeur de 1 ou de 0 après la mise à jour ($selection=(!empty($_POST['Selection']) ? 1 : 0)). Mais il peut être mis à 0 par défaut, ou à false...
Je vérifie ta proposition en fin de soirée, et je te tiens au courant.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
23 févr. 2018 à 22:12
Et bien.... en effectuant TOUTES tes requêtes.... y compris celle de création de ta table temporaire.
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
23 févr. 2018 à 23:51
Oui, avec un peu de retard, merci pour ta contribution!
Apparemment, on avance!
Voilà, j'ai mis la valeur par défaut du champ Selection = 0 et repris ta proposition de code. Or, la correspondance entre 'Index_ce' et 'Selection' ne se fait pas. En effet, si je coche 5 lignes au hasard, je récupère les 5 premières lignes de la table, si j'en coche 3, je récupère 3 premières lignes, etc (dans ma version, on récupérait toutes les lignes!).
Un avis?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
23 févr. 2018 à 16:20
Bonjour,

As tu essayé de le faire " à la mano" directement dans ta bdd pour voir ce que ça donne ?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
23 févr. 2018 à 16:21
de plus.. il semble que tu aies oublié de mettre un WHERE dans ta requête UPDATE
$update = $bdd -> prepare('UPDATE ce_copie SET Selection = :selection');
0