Mettre a jour table mysql temporaire avec checkbox

Résolu
christian82000 Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   -  
christian82000 Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   -
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > christian82000 Messages postés 47 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

As tu essayé de le faire " à la mano" directement dans ta bdd pour voir ce que ça donne ?
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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