Je n'arrive pas à parcourir un tableau $_POST

Résolu/Fermé
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 - 19 nov. 2015 à 19:42
 Utilisateur anonyme - 22 nov. 2015 à 01:35
Bonsoir ,

j'essaie de parcourir un tableau $_POST mais je ne réussis pas .

J'ai créé une liste des étudiants et normalement le code que j'ai écrit doit supprimer les noms des étudiants dont j'ai coché pour supprimer . Mais il ne marche pas : /

Voici le code que j'ai écrit (pourriez vous trouver l'erreur ou me proposer des solutions s'il vous plait ? ) :


<fieldset>
<legend> Liste des étudiants </legend>
<?php
try{
require_once('connect.php');
$connexion=new PDO('mysql:host='.SERVEUR.';dbname='.BDD,USER,PASSWORD);
$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connexion->query('SET NAMES UTF8');
$requete = "select * from etudiantsimple";
$resultat = $connexion->query($requete);
$resultat->setFetchMode(PDO::FETCH_OBJ);
$ligne = $resultat->fetch();
if ($ligne == false) {
echo ' aucun étudiant dans la liste ';
} else {
do {
echo '<p><input type="checkbox" name=" ' . $ligne->id . '">Etudiant numero '.$ligne->id .' : <input type="text" value="' . $ligne->nom . '" name="nom" readonly="readonly"/></p>';
} while ($ligne = $resultat->fetch());
$resultat->closeCursor();
}
echo ' <p><input type="reset" value="Supprimer étudiant " name="supp"></p>';
}catch(PDOException $e){
$msg = 'ERREUR dans ' .$e->getFile(). 'Ligne' .$e->getLine(). ':' .$e->getMessage();
exit($msg);
}
?>
</fieldset>

________

if(isset($_POST['supp'])){
foreach($_POST as $index ){
$requete="delete from etudiantsimple where id=$index" ;
$resultat=$connexion->query($requete);
}
}
$resultat->closeCursor();
}
_________

6 réponses

Utilisateur anonyme
19 nov. 2015 à 20:43
Bonjour

On ne voit pas tout ton code, alors ton formulaire est-il bien dansune balise <form> ?
Et le bouton de validation devrait être de type submit, pas de type reset. Reset sert à remettre le formulaire dans son état initial, mais ne l'envoie pas.
Et fais attention à l'espace en trop dans le "name" de tes checkbox
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
19 nov. 2015 à 21:26
Merci de m'avoir répondu !

Alors , non ce n'est pas sensé être un formulaire mais une liste donc je n'ai pas mis de balise <form>..

Ensuite , ai-je le droit de mettre un bouton submit même si je veux effacer des lignes ? :o

Je vais corriger les espaces :)
0
Utilisateur anonyme
19 nov. 2015 à 22:02
non ce n'est pas sensé être un formulaire

Si, c'est censé être un formulaire. Sans formulaire, pas de $_POST.

Et pour envoyer le formulaire, il faut un bouton submit. Tu as aussi le droit de mettre un bouton reset si tu veux effacer le formulaire, mais si tu n'as qu'un seul bouton, avoir le reset sans le submit n'a pas de sens (sauf si tu utilises javascript, mais tu n'as pas l'air d'en être là)
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
19 nov. 2015 à 22:14
Et du coup je peux mettre cette liste dans un formulaire ? :o
0
Utilisateur anonyme
19 nov. 2015 à 22:22
Je ne dirais pas que tu peux : tu DOIS.

Tu as un peu étudié le HTML avant de te lancer dans une application avec PHP et base de données ?
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
19 nov. 2015 à 22:28
oui j'ai fait un peu de HTML/CSS mais je ne savais pas ca..

donc, voici le code corrigé mais ca marche toujours pas : / (normalement il doit m'afficher bla mais il m'affiche blabla a chaque fois ) :


<form id="formulaireSupprimer" action="site.php" method="post">
<fieldset>
<legend> Liste des étudiants </legend>
<?php
function getConnect(){
require_once('connect.php');
$connexion=new PDO('mysql:host='.SERVEUR.';dbname='.BDD,USER,PASSWORD);
$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connexion->query('SET NAMES UTF8');
return $connexion;
}
try{
$connexion=getConnect();
$requete = "select * from etudiantsimple";
$resultat = $connexion->query($requete);
$resultat->setFetchMode(PDO::FETCH_OBJ);
$ligne = $resultat->fetch();
if ($ligne == false) {
echo ' aucun etudiant dans la liste ';
} else {
do {
echo '<p><input type="checkbox" formmethod="post" name="'.$ligne->id.'"/> Etudiant numero '.$ligne->id.': <input type="text" value="'.$ligne->nom.'" name="nom" readonly="readonly"/> </p>';
} while ($ligne = $resultat->fetch());
$resultat->closeCursor();
}
?>
<p> <input type="submit" value="Supprimer etudiant " name="supp" /> </p>
<?php
if(isset($_POST['supp'])) {
if(!empty($_POST['$ligne->id'])){
echo 'bla';
}else {
echo 'blabla';
}
}
}catch(PDOException $e){
$msg = 'ERREUR dans ' .$e->getFile(). 'Ligne' .$e->getLine(). ':' .$e->getMessage();
exit($msg);
}
?>
</fieldset>
</form>
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
19 nov. 2015 à 22:32
je pense que le problème vient de cette ligne :
 if(!empty($_POST['$ligne->id'])){ 

mais j'arrive pas à voir l'erreur :(
0
Utilisateur anonyme
19 nov. 2015 à 22:40
Tu testes $_POST['$ligne->id'], mais ce test n'a aucun sens.
Tu n'as aucun champ de ton formulaire qui s'appelle $ligne->id.
Fais un print_r($_POST); pour voir ce que t'envoie ton formulaire
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
19 nov. 2015 à 22:44
le print_r($_POST) m'affiche ca : Array ( [nom] => jeti [8] => on [9] => on [supp] => Supprimer etudiant )

je voulais tester if(!empty($_POST['$ligne->id'])) pour vérifier si une case a étée cochée ou non. .?!
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
19 nov. 2015 à 22:45
PS. le print_r($_POST) affiche ca car avant de cliquer le buton submit j'ai coché les étudiants nr 8 et 9
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
19 nov. 2015 à 23:11
Alors, j'ai écrit ce code :


if(isset($_POST['supp'])) {
print_r($_POST);
foreach($_POST as $key=>$val ){
$requete = "delete from etudiantsimple where id=$key";
$resultat = $connexion->query($requete);
$resultat->closeCursor();
}
}


et ca supprime quand je coche les étudiants à supprimer un par un mais quand je selectionne 2 ou + il m'affihe d'abord ca : Array ( [13] => on [nom] => sh [14] => on [supp] => Supprimer etudiant ) ERREUR dans C:\wamp\www\.................... .phpLigne59:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'supp' in 'where clause' mais une fois que je fais un F5 il les supprime .. As toi une idée comment puis-je faire pour qu'il ne m'affiche plus cet erreur ? Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tester $_POST['$ligne->id'] n'avait pas de sens, je le répète, car '$ligne->id' entre apostrophes n'est pas une variable PHP, mais une chaîne de caractères (comme 'toto' ou 'bonjour'). Même si tu avais écrit $_POST[$ligne->id], ça n'aurait pas marché car au moment où tu le fais, la variable $ligne contient "false" puisque tu es sorti du do-while.

Pour en revenir à ton problème de unknown column Supp, il vient du fait que tu essayes d'effacer tout ce qu'il y a dans $_POST ; or il il a bien autre chose que les id que tu cherches à effacer.
Une solution (pas élégante, mais on n'est plus à ça près) consiste à tester avec is_numeric si la $key que tu récupères est bien un nombre, donc un id qu'il faut effacer.
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
21 nov. 2015 à 22:58
Merci beaucoup , j'ai ajouté le test avec is_numeric et ca marche :) Mais as tu une idée comment puis je faire pour ne pas avoir besoin de faire un "refresh" pour voir la liste sans l'étudiant que j'ai supprimé ? :o
0
Utilisateur anonyme
21 nov. 2015 à 23:11
Tu as mis le traitement du formulaire avec ta requête delete APRÈS l'affichage de la liste.
Donc quand tu cliques sur le bouton "submit", tu affiches d'abord ta liste d'étudiants, et ensuite seulement tu les effaces de la base de données. Mais ça ne change rien à l'affichage, puisqu'il a déjà eu lieu. Tes étudiants sont toujours affichés, il ne disparaîtront que quand tu réafficheras ta page.

Il faut TOUJOURS traiter les formulaires reçus en début de script, et non pas à la fin, pour que l'affichage tienne compte des données du formulaire.
0
alla123321 Messages postés 25 Date d'inscription dimanche 20 septembre 2015 Statut Membre Dernière intervention 2 octobre 2016 1
22 nov. 2015 à 01:03
Alors , même en laissant comme ca mon code je peux réofficher la page après des changements effectués en ajoutant cette ligne sous ma boucle foreach : header('location: monSite.php');

Donc , ma question est résolue . Merci beaucoup de ton aide ! :)
0
Utilisateur anonyme
22 nov. 2015 à 01:35
Non, il ne fut pas le faire comme ça. C'est totalement illogique. Tu commences par envoyer une mauvaise page, puis tu provoques une redirection pour recharger la bonne. Alors que tu pouvais directement afficher la bonne page.
De plus, dès que ta liste d'étudiants sera un peu plus longue, cela provoquera une erreur 'headers already sent' et tu reviendras ici demander pourquoi en disant que "ça marchait avant".
0