Comment créer les tables pour un concours par choix de critères
Hors ligneClicky Le 26/08/2007 à 00:48 Profil de Clicky Configuration de Clicky

lélàménan
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.

Plus de précisions :
Il y a l'inscrit, qui diffère selon si c'est une nana ou un gars. Le choix dans la table `concours_inscrits` est 'n' pour nana et 'g' pour gars via le champ `inscrit_sexe` qui a 'a' pour valeur par défaut et dont je valide ou non l'inscription avec le champ `inscrit_valid` qui a une valeur de '0' par défaut et qui prend '1' quand c'est validé.
Cet inscrit, a accès à sa fiche via la liste des inscrits nana ou la liste gars selon son sexe, les votants (non-inscrits) y ont accès aussi, pour pouvoir voter.
Sur cette fiche, il y a donc le pseudo de l'inscrit, son sexe en rappel, sa description, et un formulaire pour que le votant (le non-inscrit) puisse choisir les critères de l'inscrit.
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.

J'aimerais savoir si mes tables sont bien structurées pour ce genre de projet :

-- Structure de la table `concours_inscrits`
-- 

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=57 ;

-- 
-- Contenu de la table `concours_inscrits`
-- 

INSERT INTO `concours_inscrits` VALUES (3, '234.16.8.10', 'Truc', 'pouet', '', 'n', 1);
INSERT INTO `concours_inscrits` VALUES (8, '227.38.32.25', 'Bidule', 'truc', '', 'g', 1);
INSERT INTO `concours_inscrits` VALUES (10, '121.58.78.36', 'Machine', 'description', '', 'n', 1);
INSERT INTO `concours_inscrits` VALUES (13, '223.30.75.13', 'Agaga', 'bidule', '', 'g', 1);
INSERT INTO `concours_inscrits` VALUES (14, '245.42.57.17', 'Shoobeedoo', 'Petite description pour voir comment marche le script', '', 'n', 1);
INSERT INTO `concours_inscrits` VALUES (15, '127.0.0.1', 'dudul', 'description de dudul', '', 'g', 1);
INSERT INTO `concours_inscrits` VALUES (21, '127.0.0.1', 'Machin', 'youpla', '', 'g', 1);
INSERT INTO `concours_inscrits` VALUES (22, '127.0.0.1', 'boubou', 'bouiboui', '', 'n', 1);
INSERT INTO `concours_inscrits` VALUES (56, '127.0.0.1', 'Doudoudidon', ' Parlez un peu de vous..\r\nok', 'truc@mail.fr', 'n', 1);

-- --------------------------------------------------------

-- 
-- Structure de la table `concours_criteres`
-- 

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 ;

-- 
-- Contenu de la table `concours_criteres`
--

INSERT INTO `concours_criteres` VALUES (1, 'Bon animateur');
INSERT INTO `concours_criteres` VALUES (2, 'Assez à l''écoute');
INSERT INTO `concours_criteres` VALUES (3, 'Répondant aux demandes d''aide');
INSERT INTO `concours_criteres` VALUES (4, 'Toujours courtois');

-- --------------------------------------------------------

-- 
-- Structure de la table `concours_votants`
-- 

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=6 ;

-- 
-- Contenu de la table `concours_votants`
-- 

INSERT INTO `concours_votants` VALUES (1, '129.38.82.50', 'pouet@mail.com');
INSERT INTO `concours_votants` VALUES (4, '127.0.0.1', 'pouet2@mail.com');
INSERT INTO `concours_votants` VALUES (5, '127.0.0.1', 'pouet3@mail.fr');

-- --------------------------------------------------------

-- 
-- Structure de la table `concours_insc_crit_vot`
-- 

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;


j'espère que je n'ai pas été trop floue.

Merci d'avance.
--

Clicky infographiste freelance

Hors ligneAnthony Le 26/08/2007 à 12:30 Profil de Anthony Configuration de Anthony

Fou du volant
Salut et bienvenue

Quelques petits trucs : Pour le sexe, personnellement j'aurais pris un TINYINT (0, 1, 2) et idem pour le "inscrit_valid" (soit 0 soit 1 je présume) donc un TINYINT ayant pour taille "1" ça suffit amplement pour ces deux champs.
--

Hors ligneClicky Le 26/08/2007 à 16:36 Profil de Clicky Configuration de Clicky

lélàménan
Bonjour,

Merci beaucoup pour la bienvenue et pour m'avoir répondu.

Pour le sexe, en fait j'ai mis a, n, g parce qu'après j'ai besoin de le re-différencier à l'affichage, exemple : $g = 'gars', mais peut-être que ça ne gênerai pas, avec ton conseil (0, 1, 2).
On m'a conseillé de mettre INT pour `inscrit_valid` mais visiblement, l'optimisation est peut-être meilleure avec TINYINT..
Je vais essayer de continuer, je crois que je vais réfléchir un moment sur le code de traitement des résultats avec la dernière table qui lie les trois premières..

Encore merci, à bientôt

Clicky
--

Clicky infographiste freelance

Hors ligneDarkingod Le 26/08/2007 à 18:29 Profil de Darkingod Configuration de Darkingod

Pour les champs qui ont un choix prédefini, je conseil plutôt le type ENUM qu'au type FLOAT (Même pour 0 ou 1).
Hors ligneClicky Le 26/08/2007 à 19:28 Profil de Clicky Configuration de Clicky

lélàménan
Bonjour,

Oui, j'avais lu ça dans des forums, articles et docs, d'où mon choix de le mettre déjà pour le champ sexe, ça marche bien en tout cas..
Par contre, il faut peut-être que je revoie ma table pour les critères puisqu'ils sont déjà définis.
Enfin, je vais déjà essayer comme ça et je verrai après..

Merci !
--

Clicky infographiste freelance

Hors ligneAnthony Le 27/08/2007 à 00:26 Profil de Anthony Configuration de Anthony

Fou du volant
Tinyint occupe 1 octet en mémoire, contrairement au type INT qui en occupe 4, les performances en terme d'espace occupé sont donc meilleures, et en terme de performances quand il s'agit de récupérer des données, idem ;)
--

Hors ligneClicky Le 27/08/2007 à 10:44 Profil de Clicky Configuration de Clicky

lélàménan
Bonjour,

je vais essayer d'optimiser tout ça au mieux.
En même temps, je ne pense pas avoir des milliers d'utilisateurs de ce concours, mais qui peut le plus, peut le moins

Merci beaucoup à vous pour les infos, à bientôt !

Clicky
--

Clicky infographiste freelance

Hors ligneClicky Le 05/09/2007 à 00:20 Profil de Clicky Configuration de Clicky

lélàménan
Bonsoir,

Cette fois, j'ai un problème avec la requête qui enregistre mes dernières données dans la dernière table :

<?php
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());
}
?>


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 :

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

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..

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

Merci d'avance.
--

Clicky infographiste freelance

Hors ligneAnthony Le 05/09/2007 à 18:47 Profil de Anthony Configuration de Anthony

Fou du volant
Salut,

Quel est le code html (et que contient-il) de ton formulaire ?
--

Hors ligneClicky Le 05/09/2007 à 20:05 Profil de Clicky Configuration de Clicky

lélàménan
Bonsoir,

En fait, mon problème a été résolu entre temps (je voulais mettre ce message ce matin mais je n'ai pas pu à cause du système anti-flood du forum ), on m'a conseillé ceci :

<?php
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());
}
?>


Ça marche comme je voulais finalement.

Merci, à bientôt
--

Clicky infographiste freelance

Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels