Enregistrement de plusieurs checkbox dans une base de données

Eléphanteau du PHP | 43 Messages

29 août 2007, 12:07

Bonjour,

Je suis en train d'essayer de mettre au point un petit concours.
Il y a les inscrits, les votants (qui eux ne sont inscrits nulle part), les critères de vote (par checkbox, plusieurs choix possible) et j'aimerais enregistrer le résultat des checkbox choisis dans une table qui lie tout le petit monde décrit plus haut.
J'ai une première table pour les inscrits, une seconde pour les votants, une troisième pour les critères qui sont déjà dedans, et la quatrième qui sert de liaison entre les trois première :

Code : Tout sélectionner

CREATE TABLE `concours_inscrits` ( `inscrit_id` int(11) NOT NULL auto_increment, `inscrit_ip` varchar(15) NOT NULL default '', `inscrit_pseudo` varchar(50) NOT NULL default '', `inscrit_description` text NOT NULL, `inscrit_email` varchar(250) NOT NULL default '', `inscrit_sexe` enum('a','n','g') NOT NULL default 'a', `inscrit_valid` bigint(1) default '0', PRIMARY KEY (`inscrit_id`), KEY `id` (`inscrit_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE `concours_criteres` ( `critere_id` int(11) NOT NULL auto_increment, `critere_nom` varchar(50) NOT NULL default '', PRIMARY KEY (`critere_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE `concours_votants` ( `votant_id` int(11) NOT NULL auto_increment, `votant_ip` varchar(15) NOT NULL default '', `votant_email` varchar(250) NOT NULL default '', PRIMARY KEY (`votant_id`), KEY `id` (`votant_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE `concours_insc_crit_vot` ( `icv_crit_id` int(11) NOT NULL default '0', `icv_votant_id` int(11) NOT NULL default '0', `icv_inscrit_id` int(11) NOT NULL default '0', `icv_valeur` char(1) NOT NULL default '0', PRIMARY KEY (`icv_crit_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Les tables `concours_inscrits` et `concours_votants` se remplissent bien, mais j'ai un problème avec la quatrième, qui s'incrémente bien mais juste pour une seule checkbox alors que j'en choisie plus d'une pour les tests. L'id du votant ne s'enregistre pas, comme s'il n'avait pas le temps de le faire dans la dernière `concours_insc_crit_vot`, juste après l'avoir fait dans sa table `concours_votant` (les deux enregistrements sont censés se faire sur la même page de traitement).

Extrait de mon formulaire :

Code : Tout sélectionner

<form method="post" action="vote_gars_traitement.php"> <fieldset><legend>Formulaire de vote</legend><br /> <input type="hidden" name="inscrit_id" value="<?php echo $_GET['inscrit_id']; ?>" /> <input type="hidden" name="inscrit_pseudo" value="<?php echo $_GET['inscrit_pseudo']; ?>" /> <input type="hidden" name="votant_id" value="<?php echo $_POST['votant_id']; ?>" /> Vous trouvez ce concurrent :<br /> (Vous avez droit à plusieurs choix)<br /><br /> <input type="checkbox" name="critere_valeur[a]" value="a"> Bon animateur.<br /> <input type="checkbox" name="critere_valeur[b]" value="b>"> Préfère le dialogue aux remballages.<br /> <input type="checkbox" name="critere_valeur[c]" value="c>"> Prêt à aider les nouveaux venus.<br /> <input type="checkbox" name="critere_valeur[d]" value="d>"> Toujours courtois.<br />
Et un extrait du traitement du formulaire, pour la partie des checkbox :
$critere_valeur = $_POST['critere_valeur'];
		
		//On vérifie que les champs ne continennent pas de html
		$inscrit_id = mysql_real_escape_string(htmlentities($_POST['inscrit_id']));
		$inscrit_pseudo = mysql_real_escape_string(htmlentities($_POST['inscrit_pseudo']));
		$votant_id = mysql_real_escape_string(htmlentities($_POST['votant_id']));
		
		if (isset($_POST["critere_valeur"]))
			{
				$critere_valeur = $_POST["critere_valeur"];
		
		mysql_query("
		INSERT INTO concours_insc_crit_vot (icv_id, icv_votant_id, icv_inscrit_id, icv_valeur) 
		VALUES ('', '".$_POST['votant_id']."', '".$_POST['inscrit_id']."', '".$_POST['critere_valeur']."') ") or die (mysql_error());
			}
Mais peut-être qu'il faut que je fasse les isset sur toutes les checkbox (critere_valeur[a], critere_valeur, etc..) et qu'ensuite, je fasse ma requête INSERT INTO en répètant l'opération pour chaque checkbox, genre :

INSERT INTO concours_insc_crit_vot (icv_id, icv_votant_id, icv_inscrit_id, icv_valeur)
VALUES ('', '".$_POST['votant_id']."', '".$_POST['inscrit_id']."', '".$_POST['critere_valeur[a]']."'), ('', '".$_POST['votant_id']."', '".$_POST['inscrit_id']."', '".$_POST['critere_valeur']."'), etc..") or die (mysql_error());

J'en ai écrit un peu long, mais les explications me semblaient utiles.
Pourriez-vous m'aider pour ce genre de cas s'il vous plaît ?
Par avance, merci.
Clicky

ViPHP
ViPHP | 2291 Messages

29 août 2007, 12:16

<input type="hidden" name="votant_id" value="<?php echo $_POST['votant_id']; ?>" />
Pourquoi elle est en $_POST et pas $_GET comme les autres et d'ou vient t'elle :?:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphanteau du PHP | 43 Messages

29 août 2007, 12:21

Elle est sur la page du formulaire de vote qui demande l'e-mail du votant (là, on ne voit pas le champ qui se trouve juste après les checkbox), les autres viennent de la page d'inscription.
Je dois la mettre en $_GET aussi dans ce cas là ?..
Clicky

ViPHP
ViPHP | 2291 Messages

29 août 2007, 12:25

Elle est sur la page du formulaire qui demande l'e-mail du votant, les autres viennent de la page d'inscription.
Je dois la mettre en $_GET aussi dans ce cas là ?..
Je pense que oui puisqu'elle va dans un champ caché donc je ne voie pas d'autre moyen de la transmettre :!: :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphanteau du PHP | 43 Messages

29 août 2007, 12:33

Ah bon ok, je vais essayer, merci beaucoup :)

Et pour mon problème d'INSERT INTO multiple, aurais-tu une idée de comment procéder s'il te plaît ? Ou bien ma suggestion en fin de post est-elle bonne ?

Merci pour ton aide.
Clicky

ViPHP
ViPHP | 2291 Messages

29 août 2007, 13:01


Et pour mon problème d'INSERT INTO multiple, aurais-tu une idée de comment procéder s'il te plaît ? Ou bien ma suggestion en fin de post est-elle bonne ?
Je n'ai pas les comphétences pour répondre à cette question mais je suis certain que d'autre ici vont se faire un plaisir de t'aider, attend qu'il passe par ici :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

ViPHP
ViPHP | 2291 Messages

29 août 2007, 13:23

Ah bon ok, je vais essayer, merci beaucoup :)

Et pour mon problème d'INSERT INTO multiple, aurais-tu une idée de comment procéder s'il te plaît ? Ou bien ma suggestion en fin de post est-elle bonne ?

Merci pour ton aide.
Je vient de voir qu'il y à une erreur dans ta table "concours_insc_crit_vot " il n'y à pas de champ qui porte le nom "icv_id" mais il s'appelle "icv_crit_id" et en modifiant l'erreur chez moi sa fonctionne :wink: :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphanteau du PHP | 43 Messages

29 août 2007, 14:07

Je vient de voir qu'il y à une erreur dans ta table "concours_insc_crit_vot " il n'y à pas de champ qui porte le nom "icv_id" mais il s'appelle "icv_crit_id" et en modifiant l'erreur chez moi sa fonctionne :wink: :wink:
Oui, en faite, je l'avais déjà changé entre-temps et j'ai oublié de le modifier dans le post, désolée :?
mais même changé, ça ne marche pas. l'enregistrement s'incrémente bien, l'id de l'inscrit s'enregistre bien aussi, mais toujours pas celui du votant, et toujours un seul de mes critères choisies s'enregistre.

Je vais essayer d'agiter plus mes cellules grises en attendant d'avoir d'autres avis.

Merci pour la rapidité de tes réponses en tout cas :wink:

À bientôt.
Clicky

ViPHP
ViPHP | 2291 Messages

29 août 2007, 14:11

Je vient de voir qu'il y à une erreur dans ta table "concours_insc_crit_vot " il n'y à pas de champ qui porte le nom "icv_id" mais il s'appelle "icv_crit_id" et en modifiant l'erreur chez moi sa fonctionne :wink: :wink:
Oui, en faite, je l'avais déjà changé entre-temps et j'ai oublié de le modifier dans le post, désolée :?
mais même changé, ça ne marche pas. l'enregistrement s'incrémente bien, l'id de l'inscrit s'enregistre bien aussi, mais toujours pas celui du votant, et toujours un seul de mes critères choisies s'enregistre.

Je vais essayer d'agiter plus mes cellules grises en attendant d'avoir d'autres avis.

Merci pour la rapidité de tes réponses en tout cas :wink:

À bientôt.
Pour l'insertion multiple tu peut aller voir ici
Comment récupére tu l'id du votant ?
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphanteau du PHP | 43 Messages

29 août 2007, 15:30

Pour l'insertion multiple tu peut aller voir ici
Merci beaucoup, je vais essayer :wink:
Comment récupére tu l'id du votant ?
Avec le champ hidden justement, j'avais fait ça :

Code : Tout sélectionner

<input type="hidden" name="votant_id" value="<?php echo $_POST['votant_id']; ?>" />
et ensuite changé le $_POST en $_GEST comme tu me l'as conseillé, mais comme c'est pour récupérer une valeur du formulaire qui est sur la même page, je me suis dis qu'il valait peut-être mieux mettre :

Code : Tout sélectionner

<input type="hidden" name="votant_id" value="<?php echo votant_id; ?>" />
Mais une fois traité, ça m'affiche une erreur de syntaxe près de votant_id mais je ne vois pas où est l'erreur.
Ensuite, dans la page de traitement pour le récupèrer , j'ai :
$votant_id = mysql_real_escape_string(htmlentities($_POST['votant_id']));
puis :
if (isset($_POST["critere_valeur"]))
			{
				$critere_valeur = $_POST["critere_valeur"];
		
		mysql_query("
		INSERT INTO concours_insc_crit_vot (icv_id, icv_votant_id, icv_inscrit_id, icv_valeur) 
		VALUES ('', '".$_POST['votant_id']."', '".$_POST['inscrit_id']."', '".$_POST['critere_valeur']."') ") or die (mysql_error());
			}
Et là, je me dis qu'il faudrait peut-être que je fasse un isset aussi sur le votant_id en plus de celui du critere_valeur..
je vais faire des essais en attendant un avis :)

À bientôt.
Clicky

ViPHP
ViPHP | 2291 Messages

29 août 2007, 16:40

<input type="hidden" name="votant_id" value="<?php echo votant_id; ?>" />
Pour sa c'est soit
<input type="hidden" name="votant_id" value="<?php echo "votant_id"; ?>" />
ou
<input type="hidden" name="votant_id" value="<?php echo $votant_id; ?>" />
Mais comme je ne connais pas TOUT ton formulaire c'est pas évident :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphanteau du PHP | 43 Messages

29 août 2007, 17:08

Que j'essaie avec l'un, l'autre ou le troisième, votant_id ne s'enregistre toujours pas, à moins que je fasse mal ma requête, c'est possible aussi.. :?
Voici mon formulaire entier :
<form method="post" action="vote_gars_traitement.php">
<fieldset><legend>Formulaire de vote</legend><br />
<input type="hidden" name="inscrit_id" value="<?php echo $_GET['inscrit_id']; ?>" />
<input type="hidden" name="inscrit_pseudo" value="<?php echo $_GET['inscrit_pseudo']; ?>" />
<input type="hidden" name="votant_id" value="<?php echo "votant_id"; ?>" />
Vous trouvez ce concurrent :<br />
(Vous avez droit à plusieurs choix)<br /><br />
<input type="checkbox" name="critere_valeur[]" value="1"> Bon animateur.<br />
<input type="checkbox" name="critere_valeur[]" value="2"> Préfère le dialogue aux remballages.<br />
<input type="checkbox" name="critere_valeur[]" value="3"> Prêt à aider les nouveaux venus.<br />
<input type="checkbox" name="critere_valeur[]" value="4"> Toujours courtois.<br />

<!--saisie de l'adresse e-mail du votant-->
<p>Pour pouvoir voter pour ce concurrent, vous devez entrer votre adresse E-mail :<br />
<label for="email"><strong>*</strong> Votre E-mail :</label>
<input type ="text" name="votant_email" id="email" /><br /><br />
<strong>*</strong> Veuillez saisir le résultat de l'opération suivante (système anti-spam) :<br /><br />
<?php
include_once ("includes/antispam.php");
antispam_ins();
echo "<br /><input type='submit' name='submit' value='Envoyer' id='submit' />";
echo "</form>";
?>
</fieldset>
</p>
Pour la récupèration des critères, j'ai voulu essayer le code de la page que tu m'as donné, mais je ne comprends pas trop à quoi correspondent les variables de la partie traitement..
Je pense que $champ correspond à l'id du critère, que $valeur correspond au value du critère du checkbox du formulaire et $check correspond au name du checkbox.

Ralala, je pédale dans la semoule et je n'arrive pas à trouver un exemple où serait expliqué comment ajouter tout ça dans une table.. :-k

Je vais essayer de chercher encore :)
Clicky

Mammouth du PHP | 1776 Messages

29 août 2007, 17:48

Code : Tout sélectionner

<input type="hidden" name="inscrit_id" value="<?php echo $_GET['inscrit_id']; ?>" /> <input type="hidden" name="inscrit_pseudo" value="<?php echo $_GET['inscrit_pseudo']; ?>" /> <input type="hidden" name="votant_id" value="<?php echo "votant_id"; ?>" />
Oula :roll:
$_GET permet de recupérer une variable envoyée dans l'url ou envoyé par un formulaire en method=GET
$_POST permet de recupérer une variable envoyée par un formulaire en method=POST

A parti de là, d'où viennent les variables inscrit_id, inscrit_pseudo et votant_id ? Si c'est le réaffichage des données de ton formulaire, la syntaxe sera :

Code : Tout sélectionner

value="<?php echo $_POST['inscrit_pseudo']; ?>"
value="<?php echo "votant_id"; ?>" ne veut rien dire ici, ou pire ca aurait pu être value="<?php echo $votant_id; ?>" mais ca voudrait dire que soit tu as une variable $votant_id dans ton script et là c'est super, ou alors tu passe par l'ancienne méthode de recuperation des variables et là c'est critique.
Détaille stp le point d'arrivée de tes variables inscrit_id, inscrit_pseudo et votant_id ?

Eléphanteau du PHP | 43 Messages

29 août 2007, 18:19

Les deux premiers hidden viennent de l'url dont j'ai récupéré les infos via un lien sur les pseudos affichés dans la page de la liste des inscrits gars, en fait je n'ai besoin là que de l'id de l'inscrit, pour pouvoir le rentrer dans la quatrième table, je pourrais donc enlever l'hidden du pseudo qui ne me servira finalement pas.
Le troisième hidden est directement dans le formulaire de vote, pour le garder en mémoire pour pouvoir ensuite l'utiliser dans la page de traitement de ce dernier formulaire.
j'ai essayé un simple :

Code : Tout sélectionner

<input type="hidden" name="votant_id" value="<?php echo votant_id; ?>" />
parce que j'ai déjà vu l'exemple dans un formulaire qui marche.. Mais là, il ne marche pas.

Si ça peut t'aider à comprendre mon problème.
Merci.
Clicky

ViPHP
ViPHP | 2291 Messages

29 août 2007, 18:19

Pour l'insertion multiple tu peut aller voir ici
Merci beaucoup, je vais essayer :wink:
Sinon je viens d'essayé comme ceci
$critere_valeur = $_POST['critere_valeur'][1].":".$_POST['critere_valeur'][2].":".$_POST['critere_valeur'][3].":".$_POST['critere_valeur'][4];
Et les champ cocher s'incrive bien dans la TABLE sous cette forme
exemple des 4 cases cocher) -> A : B : C : D

Maintenant il y à probablement d'autre méthode mais je ne les connais pas :cry:

Pour le reste il faut savoir comment tu transmet tes ID :?:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.