Bonsoir à tous,
Ayant beaucoup appris sur Grafikart je souhaiterais votre aide.
Mon site (un webzine) a suivit un développement simple (pas de MVC ni autre framework), j'ai suivi le tutoriel "Décomposer un site en PHP avec obStart".
Pour ce webzine, je souhaiterais créer plusieurs concours avec trois de réponses par concours. Le choix de la réponse se ferais avec un input type radio, là rien de bien sorcier.
Où je bloque c'est notamment pour la structure de la base de données. Au début j'étais parti sur une seule table mais je me suis aperçu que j'aurais été ennuyé pour gérer plusieurs concours à la fois.
La table en question:
cid
concours_question
concours_rep01
concours_rep02
concours_rep03
concours_titre
concours_nom
concours_prenom
concours_email
concours_reponse
concours_ip
concours_id
On remarque bien que cela va être impossible à gérer de cette façon. J'en suis arrivé à deux tables actuellement mais je me pose des questions sur ma façon de faire:
mc_concours
cid
concours_question
concours_cree
concours_fin
concours_rep01
concours_rep02
concours_rep03
mc_concours_participants
concours_titre
concours_nom
concours_prenom
concours_email
concours_reponse
concours_ip
concours_id
En fait, je souhaiterais gérer tous les concours via mon administration (tous les concours en cours, quel participant a jouer à quel concours, la date de fin du concours etc)
Sur le site, serait afficher tous les concours avec un lien vers les formulaires de participation.
Côté HTML et PHP il ne devrait pas y avoir de souci (normalement ^^) mais où je coince c'est pour la structure des différents tables nécessaire pour réaliser mon système.
Pouvez-vous m'éclairer un peu plus ?
Merci.
Salut Daysend,
Je suis pas un expert mais je peut te proposer ça :
mc_concours
concours_id (1)
concours_titre (informatique)
concours_cree (12/11/2012)
concours_fin (22/11/2012)
questions_id (2)
participants_id (200)
mc_questions
questions_id (2)
questions_texte (Quelle marque ci-dessous, ne fabrique pas d'ordinateur?)
questions_rep01 (Renault)
questions_rep02 (Apple)
questions_rep03 (HP)
questions_bonne_rep (Renault)
mc_participants
participants_id (200)
participants_nom (toto)
participants_prenom (toto)
participants_email (toto@gmail.com)
participants_reponse (Renault)
participants_date_reponse (16/11/2012)
participants_ip (192.168.23.54)
Exemple de récupération de tous les particpants au concours 1 :
Select participants_nom, participants_prenom, participants_reponse
From mc_concours, mc_participants
Where mc_concours.concours_id = mc_participants.participants_id
l'avantage de les séparer, est de permettre une amélioration dans le temps exemple si tu voudra mettre des type de question, il te suffira de crée une table Type_Question et d'inséré un nouvelle attribut dans la table question qui est la clé primaire Type_question.
Il te suffira de rajouter dans tes requêtes l'id de Type_question.
après je ne sait pas réellement toutes les possibilités mais je pense que celle-ci est bien.
Ce n'est que mon opinion il peut y avoir mieux :) j'ai des bases mais c'est vrai que pour les bases de données faut réfléchir aussi au future :)
J'espère t'avoir aidée au mieux :)
WebMaster Junior chez 123plantes
Re :)
Je construis actuellement les tables nécessaires et je me pose une question.
Avec cette structure, un participant peut-il participer à plusieurs concours à la fois ?
Merci.
Re :)
de rien :)
Oui un participant pourra participer a 0 ou plusieurs concours et un concours peut être participer par 0 ou plusieurs participants.
En faite tu a une table en plus qui sera la liaison entre concours et participants et il faut enlever dans la table mc_concours l'attribut participants_id ce qui donne :
mc_concours
concours_id (1)
concours_titre (informatique)
concours_cree (12/11/2012)
concours_fin (22/11/2012)
questions_id (2)
mc_questions
questions_id (2)
questions_texte (Quelle marque ci-dessous, ne fabrique pas d'ordinateur?)
questions_rep01 (Renault)
questions_rep02 (Apple)
questions_rep03 (HP)
questions_bonne_rep (Renault)
mc_participants
participants_id (200)
participants_nom (toto)
participants_prenom (toto)
participants_email (toto@gmail.com)
participants_reponse (Renault)
participants_date_reponse (16/11/2012)
participants_ip (192.168.23.54)
/* nouvelle table de liaison */
mc_participants_participe_concours
concours_id (1)
participants_id (200)
Un participant peut participé a plusieurs concours et si tu veut savoir lesquels tu fait juste :
Select concours_id, concours_titre, participants_reponse, participants_date_reponse
From mc_participants_participe_concours
Where participants_id = 200
Pour qu'il participe à plusieurs concours, lors de l'insertion dans la base, tu insert toutes les données dans les tables puis pour finir tu insère l'id du participant et du concours dans la table mc_participants_participe_concours ( tu peut changer les noms :) ).
J'ai juste une petite remarque si cela ne te dérange pas car j'ai remarqué que tu utilisait l'ip dans la table participants et je voudrai savoir le bute? car si c'est pour empêcher une personne de participer au même concours, cela risque de ne pas marcher car on à toujour moyen de modifier l'ip.
Après je sais pas si c'est ton bute mais sache le :)
WebMaster Junior chez 123plantes
Re :)
Merci.
Par contre je n'arrive pas à comprendre l'utilité de la table "mc_participants_participe_concours".
Ne serait-il pas plus simple d'ajouter directement la liaison concours_id dans la table "mc_participants" ?
mc_participants
participants_id (200)
participants_nom (toto)
participants_prenom (toto)
participants_email (toto@gmail.com)
participants_reponse (Renault)
participants_date_reponse (16/11/2012)
participants_ip (192.168.23.54)
concours_id (1)
Pour répondre à ta question, le champ IP était bien pour ce but.
Merci :)
EDIT: Arf, quoique non car de cette façon comment gérer plusieurs participation du même participant.
Je m'embarque dans un truc là !!! ^^. Je pensais que cela serait simple, style articles+catégorie :(.
re :)
en faite cette table (relation) représente le passage du MCD au MLD comme les deux relation sont de type n,n elle se transforme donc en table.
un lien qui pourra t'aidé : ( tu peut trouver plusieurs autre cours sur ce sujet :) )
Il te restera plus cas faire des requêtes sur une seul table.
Pour se qui est des adresse ip, moi aussi je voudrais faire un système comme le tien pour les concours et questions mais je n'est pas le temp en se moment de me mettre dessus pour plusieurs raison mais je me suis déjà renseigner sur se sujet et il était dit que l'on pouvait changer les adresse ip donc le seul moyen est un espace membre (mais tous ne voudront peut être pas s'inscrire).
Après si tu ne veut pas faire se système tu peut également lors de la validation de réponse vérifier si le nom, prénom, email, ip, et autre information existe déja :) pour le nom et prénom tu a des faibles chance de tomber sur les même mais au cas ou tu pourrais ajouter la vérification d'email et ip pour être sur que c'est une personne différentes.
C'est se que je pense bien sur mais si d'autre personne on des solutions je veut bien les connaitres :-)
avec se système la tu peut géré plusieur participations d'un participant car pour chaque concours un même utilisateur aura un concour_id diffférents
exemple :
participant_1 à participer au concours_2
participant_1 à participer au concours_130
donc dans la table mc_participants_participe_concours tu aura sa :
concours_id : participants_id :
---------2---------------------1
-------130---------------------1
et avec une requêtes tu récupère tous les informations que tu veut :)
un autre lien qui pourra t'aidée a mieux comprendre cette table (relation) :)
WebMaster Junior chez 123plantes
Bonjour,
Merci ksta.
Je vais commencer le codage aujourd'hui. Par contre, Comment remplir la table "mc_participants_participe_concours" via le formulaire ?
Je pense que je vais partir sur 2 ou 3 page (dans l'administration).
A ton avis, bonne démarche ? ^^
Une fois le système terminé et fonctionnel (avec un peu d'aide je pense ^^) je pourrais te donner le code source complet si tu le souhaite ;)
Merci.
Bonjour,
de rien :)
pour remplir la table il te suffi une fois que tu à inséré toutes les infos dans la table concours et participant de les insérées dans cette table avec le dernier id insérée mais juste les id
exemple :
INSERT INTO "nom de table" ("participants_id", "concours_id", ...)
VALUES ("1", "2")
ou l'inverse selon l'ordre des champs :)
lastInsertId() permet de récupéré le dernier id crée dans une table donc tu récupère les deux et tu les insère comme dans l'exemple :)
Pour ma par je ferai :
1) 1 page avec création des concours, liste des concours qui comprendrai les concours actif(en se moment), concours terminée et concours inactif(se que tu prépare).
2) 1 page similaire a celle du dessus (création des questions et réponse qui sont dans quel concours (en liste), qui sont terminer ou inactif )
3) 1 page des gestions des participants avec liste des concours participer, gagner, etc...
Après à se niveau la je peut pas trop t'aidée car c'est affaire de gout d'autre te proposeront peut être autre chose mais c'est à toi de voir comment tu veut naviguer dans ton administration (est ce que tu veut tous avoir sur une page ou au contraire naviguer etc....) :)
Je peut te donner de l'aide sa me dérange pas après si je mes du temp a répondre c'est que je suis occuper mais tkt si tu veut avoir de l'aide sans problème ;)
Sa serai avec joie pour ton code :) car comme je tes dit j'aimerai plus tard faire le même système système donc si en plus j'y participe :)
WebMaster Junior chez 123plantes
Bonjour,
Je commence vraiment le codage aujourd'hui et j'aurais une petite question.
Voila, j'ai déjà codé la partie pour ajouter un concours + liste.
Je te communique simplement le if de $_POST
if(!empty($_POST)){
extract($_POST);
$addconcours = array(
'concours_titre' => $concours_titre,
'concours_fin' => $concours_fin,
'concours_online' => $concours_online,
'concours_description'=> $concours_description,
'questions_id' => $questions_id
);
$requete = $DB->prepare('INSERT INTO mc_concours (concours_cree,concours_titre,concours_fin,concours_online,concours_description,questions_id)
VALUE
(NOW(), :concours_titre, :concours_fin, :concours_online, :concours_description, :questions_id)');
$requete->execute($addconcours);
echo 'Concours ajouté !!';
}
Comment et quelle valeur donner au champ "question_id" il faut qu'il soit en auto-increment ?
<u>La table mc_concours et comme ceci</u>:
concours_id = int + auto-increment
concours_titre = varchar 255
concours_description = text
concours_cree = datetime
concours_fin = varchar 10 (elle est ajoutée manuellement, d'où le varchar)
concours_online = int
questions_id = int
Merci ;)
Bonjour,
dsl du retard :(
Si tu connait l'id de la question, il faut mettre l'id de la question mais sa va si tu na que 3 ou 4 question :) si tu en a des centaines ce qui sera le cas :) tu doit d'abord lister les questions existantes dans un select ou autre selon tes gouts mais il faut surtout que tu récupère les id des questions et quand tu insère ton concours tu insère également l'id de la question :)
par exemple lors de la création d'un concours, tu liste toute les questions et tu en sélectionne une pour ensuite inséré ton nouveau concours si la question existe déja sinon si ta question n'est pas crée (sélectionner dans la liste) alors tu crée ta question en premier puis tu fait un LastInsertId() pour récupéré le dernier id enregistrer dans la table question pour ensuite l'inséré dans ta requêtes de création de concours :)
Je sais pas si tu arrive à comprendre :) mais ta table question doit être en auto-increment et avant d'enregistrer ton concours tu doit enregistrer la question puis récupéré son id :)
Si tu à d'autre problème ou si je me suis mal fait comprendre tien moi au courant ;)
WebMaster Junior chez 123plantes
Bonjour ksta :)
Ah ok, en fait j'étais parti comme ça: "création du concours->création de la question" mais en fait il faut d'abord créer la question.
Je pense justement à un truc:
Pourquoi ne pas inverser ça, c'est-à-dire récupérer les concours dans un select au moment d'ajouter une question (en ajoutant un champ "id_concours" dans la table mc_concours_questions qui fera une sorte de liaison).
Merci pour ton aide ;)
Re :)
En effet on pourrait le faire mes faudrai changer la base de donner :) il faut inséré dans la table question l'attribut concours_id et supprimer l'attribut question_id dans la table concour :)
en faite si tu à une clé étrangère dans une table il faut quel soit existante avant de pouvoir inséré une ligne dans cette table.
Après c'est selon ton choix une base de donner peut se modifier dans le temps car si on avait pas prévu une fonctionnalité dans notre système et que l'on souhaite l'ajouter sa peut tous changer :-)
J'avais pas penser à sa quend je tes répondu mes tu peut mettre dans la table concours l'attribut question_id en null comme sa tu peut crée des concours sans question et par la suite les ajouter :)
de rien :)
envoie moi ton adresse mail si tu veut comme sa on ne rajoutera pas 100 mille commentaire sur le forum de grafikart :-)
WebMaster Junior chez 123plantes
Bonjour ksta,
Désolé du retard.
J'ai fait les modifications dans la base de données et j'ai terminé de coder les parties:
Tout est fonctionnel.
Maintenant il reste le plus dur....
....créer le système pour participer au concours !
Je vais déjà commencer par créer le formulaire d'envois.
Ok, pour le mail mais par contre je ne tient pas à le poster directement ici, à la vue de tous.