Récuperer les données d'une checkbox

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Récuperer les données d'une checkbox

par Truc » 18 mai 2006, 15:02

Si tu proposes tous les articles en meme temps le plus simple est effectivement de supprimer le contenu de la table puis de reécrire les nouvelles données.

Si tu n'en propose qu'une a la fois tu sera quand même obligé de supprimer les associations de cet article pour les reécrire. Dans ce cas tu ne supprimera pas le contenu de toute la table (moins de risques d'erreurs et de perte de données) mais seulement les données ayant comme id l'id de l'article.

par Invité » 18 mai 2006, 13:01

Est ce qu'affecter l'id au name pourrait être une solution ?
<td><input type="checkbox" name="ref[<?php echo $info->id; ?>]"
En fait je tourne de nouveau en rond sur ce suejt.

par rspir » 18 mai 2006, 08:45

C'est good ca marche ...
Merci.

Donc maintenant je créée bien mes associations et je le fais pour plusieurs articles en même temps. Je cherche maintenant une solution pour pouvoir les mettre à jour.

La seule solution que j'avais envisagé pour le moment (un peu brutale) consiste à proposer la liste des articles en cours avec leurs associations dans un formulaire pour que l'utilisateur les modifie. Vider ma table (TRUNCATE par exemple) et réécrire toutes les associations ? Je ne suis pas censé avoir plus d'une vingtaine d'articles actifs donc ce n'était pas insurmontable.

En fait les points que je n'arrive pas à lever sont
- comment détecter ce qui a été modifié ou non dans le tableau avec toutes les news ?
- si l'utilisateur décoche une case pour en cocher une autre, il faut que je supprime une association pour en écrire une autre ?

Y'a til un moyen de faire simple ? une aleternative serait de ne proposer la modif que d'une news à la fois. Mais même dans ce cas, je pense que je dois supprimer les associations pour les recréer.

par Truc » 18 mai 2006, 00:40

pour en lever les anti-slash utilise stripslashes() après la validation du formulaire:
$requete .= stripslashes($req_fin);

ensuite affiche la requête générée pour la tester dans phpmyadmin et éventuellement faire un copier coller ici si ça ne fonctionne toujours pas.

par rspir » 17 mai 2006, 23:26

Non cela ne marche pas non plus ... je récupère toujours \'rae\'

J'ai cru trouvé une soluce mais cela ne passe pas :
	<?php	
		$i=0;
		while ($info = ObjetSuivant($resultat))
		{
			$i++;
			$rae=htmlspecialchars("'rae'", ENT_QUOTES);
			$ras=htmlspecialchars("'ras'", ENT_QUOTES);
			$ram=htmlspecialchars("'ram'", ENT_QUOTES);			
		?>		
			<tr class="A<?php echo ($i%2);?>" onMouseOver="this.className='over'" onMouseOut="this.className='A<?php echo ($i%2);?>'">
				<td><?php echo $info->id;?></td>
			
				<td width=450><?php echo $info->texte;?></td>
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>, <?php echo htmlentities($rae);?>)"<?php if($info->ref=="rae") {echo " checked='checked'" ;}?>"/>				
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>, <?php echo htmlentities($ras);?>)"<?php if($info->ref=="ras") {echo " checked='checked'" ;}?>"/>				
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>, <?php echo htmlentities($ram);?>)"<?php if($info->ref=="ram)") {echo " checked='checked'" ;}?>"/>				

			</tr>
Cela ressort bien
INSERT INTO refinfo (idinf,ref) VALUES (9, 'rae'), (9, 'ras'), (9, 'ram')
Mais Mysql me fait une erreur :
Erreur dans l'exécution de la requête 'INSERT INTO refinfo (idinf,ref) VALUES (9, 'rae'), (9, 'ras'), (9, 'ram')'.
Message de Mysql : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''rae'), (9, 'ras'), (9, 'ram')' at line 1
Pourtant j'ai fait un copié collé dans phpmyadmin et cela passe ...
je vois pas

EDIT : j'ai modifié le code avec :
<?php	
		$i=0;
		while ($info = ObjetSuivant($resultat))
		{
			$i++;
//			$rae=htmlspecialchars('"rae"', ENT_QUOTES);
//			$ras=htmlspecialchars('"ras"', ENT_QUOTES);
//			$ram=htmlspecialchars('"ram"', ENT_QUOTES);			
		?>		
			<tr class="A<?php echo ($i%2);?>" onMouseOver="this.className='over'" onMouseOut="this.className='A<?php echo ($i%2);?>'">
				<td><?php echo $info->id;?></td>
			
				<td width=450><?php echo $info->texte;?></td>
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>, <?php echo htmlentities(''rae'');?>)"<?php if($info->ref=="rae") {echo " checked='checked'" ;}?>"/>				
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>, <?php echo htmlentities(''ras'');?>)"<?php if($info->ref=="ras") {echo " checked='checked'" ;}?>"/>				
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>, <?php echo htmlentities(''ram'');?>)"<?php if($info->ref=="ram)") {echo " checked='checked'" ;}?>"/>				

			</tr>
Ca ne passe toujours pas alors que tout semble bon
Si vous avez une idée ... car il doit y'avoir une autre technique surement plus simple et plus fiable que mes bidouilles

par popi » 17 mai 2006, 23:13

Comme çà peut-être ?
<input type="checkbox" name="ref[]" value="(<?php echo "".$info->id.",'rae'" ; ?>)">

par rspir » 17 mai 2006, 22:42

Bah justement, c'est ce que je teste et il en veut pas ...
Regardes ce que j'envoie à Mysql :
INSERT INTO refinfo (idinf,ref) VALUES (5,\'rae\'),(5,\'ras\'),(5,\'ram\'),(4,\'rae\')
avec ce code :

Code : Tout sélectionner

<td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>,'rae')"<?php if($info->ref=="rae") {echo " checked='checked'" ;}?>"/> <td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>,'ras')"<?php if($info->ref=="ras") {echo " checked='checked'" ;}?>"/> <td><input type="checkbox" name="ref[]" value="(<?php echo $info->id; ?>,'ram')"<?php if($info->ref=="ram)") {echo " checked='checked'" ;}?>"/>
Donc Myql me retourne :
Erreur dans l'exécution de la requête 'INSERT INTO refinfo (idinf,ref) VALUES (5,\'rae\'),(5,\'ras\'),(5,\'ram\'),(4,\'rae\')'.
Message de Mysql : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'rae\'),(5,\'ras\'),(5,\'ram\'),(4,\'rae\')' at line 1
edit : je me demandais si "htmlspecialchars" pouvait m'aider à contourner dans mon formulaire ... j'essaye de comprendre comment ca marche et si c'est ce qu'il me faut ... pas tout à fait sur

par Truc » 17 mai 2006, 22:35

arf :?

suffit de l'ajouter dans le value avec le reste
Mysql s'y attends alors remonte à la source. :wink:
value="(<?php echo $info->id; ?>,'rae')"

par rspir » 17 mai 2006, 22:26

en revanche, je galere sur un détail : je récupère effectivement l'association (1,rae) mais mysql est pas trop content parce qu'il attend (1,'rae') ....

par Truc » 17 mai 2006, 22:20

non, tu n'en as plus besoin.

Le tableau "$ref" doit contenir des données comme suite:
position valeur
0 => (1, rae)
1 => (1, ram)
2 => (2, rae)
implode regroupe le tableau en séparant les valeurs par le caractère en 1er argument, ici "," tu récupère donc:
(1, rae),(1, ram), (2, rae)
qu'il suffit ajouter au reste de la requête.

par rspir » 17 mai 2006, 22:18

Je suis encore dessus à décomposer ... pour bien comprendre.

J'avais passé tellement de temp sur le foreach pour exploiter les données des checkbox que je suis un peu ecoeuré ... c'en est trop facile :roll:

par Truc » 17 mai 2006, 22:12

au final il n'y a qu'une seule valeur dans l'attribut value.

Bien sûr pour toi il en a plusieurs mais pas pour le code :wink:
On peut passer tout ce que l'on veut en value.

par rspir » 17 mai 2006, 21:47

Voila donc ce qui me manquait ... je ne savait pas que l'on pouvait envoyer plusieurs valeurs dans le value.

Merci ... je teste de suite

par Truc » 17 mai 2006, 21:39

Salut,

Tu récupères toujours le même id parce que tu boucles sur le champ caché qui conteint l'id mais il porte le même identifiant (name)donc au final tu ne peux en récupérer qu'un seul.

Ce que tu peux faire est d'ajouter l'id au "values" des cases:
value="(<?php echo $info->id; ?>,rae)"
tu n'auras plus qu'à regrouper (avec un implode)le tableau qui contient déjà l'id et le nom de la rubrique.
$requete ="INSERT INTO refinfo (idinf,ref) VALUES "; 

$req_fin = implode(",",$ref);

$requete .= $req_fin; 

Récuperer les données d'une checkbox

par rspir » 17 mai 2006, 18:06

Bonjour

Nouveau souci avec mon formulaire ...
Voila le contexte fonctionnel : l'utilisateur peut ecrire des news. Une fois la news créée, il doit choisir dans quelle rubrique la publier.

En terme de structure, j'ai une table avec les news et une table qui gère l'association 'id de la news' et 'rubrique'

Je propose donc un formulaire qui est un tableau avec toutes les news actives sans association. J'ai mis des checkbox pour sélectionner les rubriques.

Code : Tout sélectionner

<FORM ACTION="_admin.php" METHOD="POST"> <input type=hidden name="action" value="assocref"> <center><table border=0 cellspacing=2 cellpadding=2> <tr class='titre'><th><span class='i'>i-</span>news</th> <th>RAE</th> <th>RAS</th> <th>RAM</th> <?php $i=0; while ($info = ObjetSuivant($resultat)) { $i++; ?> <tr class="A<?php echo ($i%2);?>" onMouseOver="this.className='over'" onMouseOut="this.className='A<?php echo ($i%2);?>'"> <td width=450><?php echo $info->texte;?></td> <td><input type="checkbox" name="ref[]" value="rae"<?php if($info->ref=="rae") {echo " checked='checked'" ;}?>"/> <td><input type="checkbox" name="ref[]" value="ras"<?php if($info->ref=="ras") {echo " checked='checked'" ;}?>"/> <td><input type="checkbox" name="ref[]" value="ram"<?php if($info->ref=="ram") {echo " checked='checked'" ;}?>"/> <input type=hidden name=id value="<?php echo $info->id; ?>"> </tr> <?php } ?> </table></center> <p><center> <INPUT TYPE=SUBMIT VALUE='Publier'></center> </form>
je renvoie donc sur un fichier php pour récupérer les valeursdu formulaire et écrire dans ma table d'association :

		$requete ="INSERT INTO refinfo (idinf,ref) VALUES ";
            $ref=$_POST['ref'];
            foreach ($ref as $referentiel)
            {
                $requete .= "({$_POST['id']}, $referentiel) ,";

            }
                $requete = substr($requete,0,-1);
//                ExecRequete ($requete, $connexion);         
                echo $requete."<br>";
Donc en fait je voulais en sortie avoir un truc du style :
INSERT INTO refinfo (idinf,ref) VALUES (1, rae),(1, ram), (2, rae)

Mon problème est que je récupère toujours le même id ... j'ai donc du merdé qq part mais je ne vois pas comment faire