Ta "modélisation" paraît bizarre (déjà ce serait plutôt l'id de l'élève qu'il faudrait insérer dans absents plutôt que de reprendre ses infos).
Pour commencer, ne mets pas tout ça dans ta boucle : inutile d'établir une nouvelle connexion MySQL pour chaque case cochée. Même chose pour une requête préparée, elle ne se prépare qu'une fois avant l'itération puis exécutée autant de fois que nécessaire, c'est un de leurs buts.
Pour revenir à la question, je pense que le plus simple, si j'ai compris, c'est de générer cette (unique) requête :
Code :
INSERT INTO absents(prenom, classe) SELECT prenom, classe FROM eleves WHERE id IN(/* liste des id cochés */) ;
|
(et pour le coup, on ne peut plus vraiment préparer la requête mais ce n'est qu'un détail)
En modifiant (encore que, avec la cast en int faite ci-dessous, ce n'est même pas nécessaire - à condition de virer l'espace devant l'id) :
Code :
echo"<td><input type='checkbox' name='choix[]' value=' ". $donnees['id']. " ". $donnees['prenom']. " ". $donnees['classe']. " '></td>";
|
En :
Code :
echo"<td><input type='checkbox' name='choix[]' value='" . $donnees['id'] . "'></td>";
|
Parce qu'un explode là-dessus pour retrouver tes infos, ça pourrait fonctionner mais il y a bien quand même mieux (plus viable) comme approche (quid d'un Jean Charles au CM2 : prénom = Jean, classe = Charles ?)
Soit, tout ton if devient (si je ne me suis pas planté) :
Code :
if (isset($_POST['enregistrer'], $_POST['choix']) && is_array($_POST['choix'])) { $bdd->exec ('INSERT INTO absents(prenom, classe) SELECT prenom, classe FROM eleves WHERE id IN(' . implode(', ', array_map('intval', $_POST['choix'])) . ')'); }
|
Et de 30 lignes on passe à 3.
PS : si vraiment tu veux ou as besoin d'un réaffichage des élèves sélectionnés, tu peux utiliser le même principe pour faire un SELECT (tout court).
Message édité par pluj le 13-07-2017 à 15:37:17