Traiter les données checkbox d'un formulaire

Résolu/Fermé
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 - 26 août 2007 à 20:34
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 - 5 sept. 2007 à 14:16
Bonsoir,

Je suis débutante et je suis en train d'essayer de mettre au point un petit concours où des gens peuvent s'inscrire (sans système de session ni mot de passe) et où des visiteurs non-inscrits peuvent choisir un ou plusieurs critères (par checkbox) parmi un certain nombre déjà définis (ici, il y en a quatre, tous les mêmes pour tous les inscrits) pour une seule nana et un seul gars chacun.

Pour l'instant, l'inscription, la page de la liste des nanas ainsi que celle des gars et l'affichage des fiches individuelles avec formulaire sont au point. Là où je bloque, c'est pour le traitement de mes checkbox, voici un extrait du formulaire :

Vous trouvez ce concurrent :<br />
(Vous avez droit à plusieurs choix)<br /><br />
<input type="checkbox" name="critere_nom[Bon animateur]" value="Bon animateur"> Bon animateur.<br />
<input type="checkbox" name="critere_nom[Assez à l'écoute]" value="Assez à l'écoute"> Assez à l'écoute.<br />
<input type="checkbox" name="critere_nom[Répondant aux demandes d'aide]" value="Répondant aux demandes d'aide"> Répondant aux demandes d'aide.<br />
<input type="checkbox" name="critere_nom[Toujours courtois]" value="Toujours courtois"> Toujours courtois.<br />


J'aimerai que les données choisies par le votant, puissent s'enregistrer dans une table que j'ai déjà faite :
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 ;


et qu'elles puissent être comptabilisées pour pouvoir afficher le résultat pour chaque inscrit.
Est-ce que c'est possible tels que ma table et l'extrait du formulaire sont faits ?

Merci par avance.

17 réponses

Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
26 août 2007 à 22:56
tu as ce qu'il te faut !

un as de la bdd te diras sans doute qu'on peut faire plus économe en ressource et mieux conçu, mais ça doit amplement suffire.

pour 'concours_criteres' tu insères :
… auto, 'Bon animateur'
… auto, 'Assez à l''écoute'
… auto, 'Répondant aux demandes d'aide'
… auto, 'Toujours courtois'

imagine que je sois un votant (id_votant=007) et toi une inscrite (id_inscrit=001).
je te juge "Bon animateur" (id_critere=0) et "Toujours courtois" (id_critere=3).

dans 'concours_insc_crit_vot' tu insères :
… auto, 007, 01, 0
… auto, 007, 01, 3

après tu l'exploiteras en faisant des comptages de lignes et/ou des moyennes.

"mais quoi qu'il y ait eu comme choix de fait, ils s'enregistrent tous, pas pratique"
que veux tu dire par là ???
si je ne vote que pour deux critères seuls ces deux là seront enregistrés pour ce votant et cette inscrite.
2
gabuzo Messages postés 736 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 17 avril 2008 58
26 août 2007 à 20:50
Checkbox : case à cocher
Radio button insérée dans une data box = 1 choix unique
Après, on peut sélectionner à l'enregistrement si toutes les données utiles ont été entrées
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
26 août 2007 à 20:52
salut,

je suppose que tu veux effectuer un classement.
tu dois avoir un table qui contient les concurrents (avec par exemple un 'id_concurrent')
tu fais une table 'concours' qui doit contenir un champ qui pointe vers le critère et un autre qui pointe vers le concurrent.
comme ça tu pourra faire des tris et des opérations par critère ou par concurrent.
`concours`
&bull; id
&bull; concurrent
&bull; critere

si un concurrent as deux critères, tu insères deux lignes.
0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
26 août 2007 à 21:22
Merci pour les réponses rapides.

En fait oui, c'est un genre de classement.
J'ai plusieurs tables, une pour l'inscrit, une pour le votant, une pour les critères et une dernière censée lier les trois premières :

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;


Je bloque déjà pour faire entrer les choix de critères dans la table `concours_criteres`, j'ai essayé avec un
INSERT INTO concours_criteres(crit_id, crit_nom) VALUES ('', 'Bon animateur'), ('', 'Assez à l''écoute') etc..;

mais quoi qu'il y ait eu comme choix de fait, ils s'enregistrent tous, pas pratique.

Je sens que je vais m'amuser pour remplir la dernière table..

Merci.
0

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

Posez votre question
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
27 août 2007 à 00:22
Bonsoir,

C'est ce que j'appelle une réponse enthousiaste et motivante Dalida !

" "mais quoi qu'il y ait eu comme choix de fait, ils s'enregistrent tous, pas pratique"
que veux tu dire par là ???
si je ne vote que pour deux critères seuls ces deux là seront enregistrés pour ce votant et cette inscrite."

En fait, j'essayais comme une andouille de rentrer les critères choisis, dans la tables `concours_criteres`, qui les a déjà tous, et apparemment, je devais mal concevoir ma requête pour l'insertion, parce que même si je choisissais un, deux, trois ou les quatre critères, dans tous les cas ils s'enregistraient tous dans la table, mais je viens de comprendre qu'il n'y avait juste besoin que de faire entrer les données choisies dans la dernière table `concours_insc_crit_vot`.
Ça me paraît un peu plus limpide maintenant, reste plus qu'à mettre tout ça par écrit, faire des tests et enfin, faire les calculs pour l'affichage des résultats.

Je vais pouvoir continuer, enfin essayer du moins parce que j'ai encore beaucoup à apprendre.

En tout cas, je te remercie beaucoup pour ton aide éclairant ma lanterne.

À bientôt !
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
27 août 2007 à 09:28
salut,

alors bon courage pour la suite !
et n'oublie pas de marquer le post comme 'résolu'.
-;o)
0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
27 août 2007 à 10:33
Bonjour,

J'ai de quoi m'occuper oui.. :D
Merci beaucoup.
À bientôt.
0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
4 sept. 2007 à 00:44
Bonsoir,

Je me permets de remettre le topic en "non résolu" parce que j'ai un problème avec ma requête censée enregistrer les donnèes dans la dernière table.

Si par exemple je choisie les deux premiers critères dans mon formulaire,
la requête me rentre deux fois le premier critère et une fois le second dans le champ `icv_valeur`,
comme ceci :

https://i19.servimg.com/u/f19/11/09/74/62/table_11.jpg

Et si je choisie les trois premiers critères, ça m'enregistre les données de la façon suivante :

https://i19.servimg.com/u/f19/11/09/74/62/table_12.jpg

1, puis 1 et 2, puis 1, 2 et 3..
En fait, je ne devrais avoir que les trois dernières entrées pour bien faire..

j'utilise ce code :

$nb_critere = array(1 => 0, 1, 2, 3);
$values = array();
    for($i=0; $i<sizeof($nb_critere); $i++)
    {
        if (isset($_POST['critere_nom'][$i]))
        {
            $values[] = '( NULL , "' .
            mysql_real_escape_string(htmlentities($_POST['votant_id'])) . '", "' .
            mysql_real_escape_string(htmlentities($_POST['inscrit_id'])) . '", "' .
            mysql_real_escape_string(htmlentities($_POST['critere_nom'][$i])) . 
            '")';
                        
            $req = "INSERT INTO concours_insc_crit_vot 
           (icv_id, icv_votant_id, icv_inscrit_id, icv_valeur) 
           VALUES " . implode( ',' , $values ) . ';'; 
            $result = mysql_query($req) 
            or die ("erreur sql : Impossible de sauvegarder les données. ".mysql_error());
         }
    }


Est-ce que quelqu'un pourrait m'aider à résoudre ce problème s'il vous plaît ?

Merci d'avance.
0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
4 sept. 2007 à 00:47
Le "non résolu" n'a pas été pris en compte alors je le fais là..
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
4 sept. 2007 à 00:53
salut,

Je me permets de remettre le topic en "non résolu"

c'est toi l'chef, chef !

au lieu du 'for' couplé au 'if' essaie :
foreach ($_POST['critere_nom'] as $critere)
{
    $values[] = '( NULL , "' .
    mysql_real_escape_string(htmlentities($_POST['votant_id'])) . '", "' .
    mysql_real_escape_string(htmlentities($_POST['inscrit_id'])) . '", "' .
    mysql_real_escape_string(htmlentities($critere)) .
    '")';

    $req = "INSERT INTO concours_insc_crit_vot
   (icv_id, icv_votant_id, icv_inscrit_id, icv_valeur)
   VALUES " . implode( ',' , $values ) . ';';
    $result = mysql_query($req)
    or die ("erreur sql : Impossible de sauvegarder les données. ".mysql_error());
}
0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
4 sept. 2007 à 01:21
Je viens d'essayer, et j'ai le même problème :/
Je me demande s'il n'y a pas un problème du côté de l'array..

Merci beaucoup pour ton aide et ta rapidité de réponse en tout cas ;)
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
4 sept. 2007 à 08:34
salut,

pour vérifier le contenu de ta variable :
foreach ($_POST['critere_nom'] as $key => $value)
{
         echo("<p>clé = $key ; valeur = $value</p>\n");
}

0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
4 sept. 2007 à 22:52
Bonsoir,

J'ai essayé, ça m'a affiché :

clé = 0 ; valeur = 2

clé = 1 ; valeur = 3


J'avais bien choisie les critères 2 et 3.

J'ai essayé ensuite avec la requête mais ça m'enregistre toujours trois lignes au lieu de deux, à moins qu'il faille changer certains paramètres, au vu de ton dernier foreach.

Je viens de ré-essayer en faisant :

$critere_nom = array(1 => 0, 1, 2, 3);
$values = array();
foreach ($_POST['critere_nom'] as $key => $value)
{
    $values[] = '( NULL , "' .
    mysql_real_escape_string(htmlentities($_POST['votant_id'])) . '", "' .
    mysql_real_escape_string(htmlentities($_POST['inscrit_id'])) . '", "' .
    mysql_real_escape_string(htmlentities($value)) .
    '")';

    $req = "INSERT INTO concours_insc_crit_vot
   (icv_id, icv_votant_id, icv_inscrit_id, icv_valeur)
   VALUES " . implode( ',' , $values ) . ';';
    $result = mysql_query($req)
    or die ("erreur sql : Impossible de sauvegarder les données. ".mysql_error());
}


Toujours pareil. Il doit bien y avoir un moyen que ça marche quand même.. :D
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
4 sept. 2007 à 22:57
je te propose ma version, je pense que ta façon d'entrer les données dans '$values' n'est pas bonne.
essaie en remplaçant exactement ce que tu as copié par :
<?php
foreach ($_POST['critere_nom'] as $value)
{
    $values = array( NULL ,
    '"'.mysql_real_escape_string(htmlentities($_POST['votant_id'])).'"',
    '"'.mysql_real_escape_string(htmlentities($_POST['inscrit_id'])).'"',
    '"'.mysql_real_escape_string(htmlentities($value)).'"' );

    $req = "INSERT INTO concours_insc_crit_vot
   (icv_id, icv_votant_id, icv_inscrit_id, icv_valeur)
   VALUES " . implode( ',' , $values ) . ';';
    $result = mysql_query($req)
    or die ("erreur sql : Impossible de sauvegarder les données. ".mysql_error());
}
?>
0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
4 sept. 2007 à 23:50
Ça ne marche toujours pas, j'ai ce message d'erreur :

erreur sql : Impossible de sauvegarder les données. Erreur de syntaxe près de '"77","21","3"' à la ligne 3


77, 21 et 3 sont dans l'ordre : l'id du votant, l'id de l'inscrit et le premier des checkbox choisis (les 3 et 4) donc le 3.
On dirait que la façon dont est écrit "NULL" ne lui convient pas.
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
5 sept. 2007 à 00:17
ah oui !
remplace le par deux apostrophes !
''
0
Clicky Messages postés 18 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 26 août 2009 2
5 sept. 2007 à 14:16
Bonjour,

Ça n'a pas marché, j'avais toujours ce problème de syntaxe, mais depuis, on m'a conseillé ceci :

foreach ($_POST['critere_nom'] as $key=>$critere){
    $values = '( NULL , "' .
    mysql_real_escape_string(htmlentities($_POST['votant_id'])) . '", "' .
    mysql_real_escape_string(htmlentities($_POST['inscrit_id'])) . '", "' .
    mysql_real_escape_string(htmlentities($critere)) .'")';
    $req = "INSERT INTO concours_insc_crit_vot
	(icv_id, icv_votant_id, icv_inscrit_id, icv_valeur)
	VALUES ".$values.';';
    
	$result = mysql_query($req)
	or die ("erreur sql : Impossible de sauvegarder les données. ".mysql_error());
}


Et ça marche bien \o/ problème résolu donc.
Merci pour ton aide ;o)

À bientôt.
0