Je pense que vous interprétez mal le fonctionnement de la boucle. En effet, vous affichez plusieurs lignes de votre table sous forme de groupes de champs d'entrée, mais vous ne mettez à jour qu'une seule ligne après la soumission. Si vous vouliez mettre à jour plusieurs lignes, vous auriez besoin de plusieurs identifiants (un pour chaque ligne que vous voudriez mettre à jour)
Votre navigateur choisit apparemment de soumettre en http-post les dernières instances de vos champs d'entrée id, fname et lname qui se trouvent dans le formulaire html, et ce sont ces derniers que vos champs $_POST contiendront lors de la réception de cette demande de publication http.
Il est généralement déconseillé d'avoir plusieurs champs avec le même nom dans un formulaire, ce qui se produit ici si plus d'une ligne du tableau est sélectionnée.
Vous pourriez envisager:
-
Avoir un formulaire (incluant un bouton de soumission) par ligne. De cette façon, votre navigateur sait, pour chaque formulaire, quelles valeurs de champ d'entrée identifiables de manière unique il doit soumettre.
-
Si vous souhaitez un formulaire d'édition multi-lignes, il existe de nombreuses astuces pour y parvenir. La plus simple serait probablement une convention de nommage comme fname_42 pour le 42ème champ d'entrée fname, et un champ caché dans le formulaire contenant le nombre de lignes que votre formulaire affiche. Lors du traitement de la demande de soumission, vous pourrez reconstruire les noms des entrées en comptant jusqu'au nombre total de lignes.
exemple:
for ($i=0;$i<$_POST["row_count"];$i++) {
$fname = $_POST["fname_$i"];
//utilisez $fname ici dans une requête de mise à jour
}
PS: ne me blâmez pas si cet exemple n'est pas entièrement correct sur le plan syntaxique ;) Je n'ai pas d'interprète PHP avec moi en ce moment.