05. august 2003 - 22:18Der er
23 kommentarer og 2 løsninger
Afstemning - database opbygning (PHP/MySQL)
Jeg skal have lavet et afstemningssystem med PHP/MySQL, det skal indeholde x antal afstemninger og afstemningerne skal indeholde x antal svarmuligheder.
Jeg er lidt i tvivl om hvordan jeg skal bygge databasen op (PHP og grafik kan jeg selv):
Jeg har kigget lidt rundt omkring og er kommet frem til følgende:
CREATE TABLE afstemningSpoerg ( spoergsmaalID int(5) unsigned NOT NULL auto_increment, spoergsmaal varchar(255) NOT NULL, PRIMARY KEY (spoergsmaalID) );
CREATE TABLE afstemningSvar ( svarID int(10) unsigned NOT NULL auto_increment, spoergID int(5) DEFAULT '0' NOT NULL, svar varchar(255) NOT NULL, resultat int(10) DEFAULT '0' NOT NULL, PRIMARY KEY (svarID) );
Nej, men det kommer lidt an på den fleksibilitet og de anvendelsesmuligheder, du ønsker.
Jeg ville normalt gøre noget i stil med:
Enhver bruger, der besøger sitet får sat en cookie. Denne er f.eks. unixtime (og måske deres IP-nummer, et tilfældigt tal eller lignende, så det er "rimeligt unikt".
Denne cookie bruges i en tabel til at registere om man har stem eller ej.
Man kan grundlæggende lave forskellige modeller for spørgsmål/svar - enten fri multiple chioce, "1x2" eller en af flere.
Multiple choice vil normalt medføre: spørsmål -< svarudfald >- unikbrugerid.
"1x2" modellen ville være at der altid er (maks. x antal svar og de ligger i spørgsmålstabellen.
Når du laver voting systemer vil det - nogle gange (alt efter data volumen og anvendelse) være en god ide at lave udløbsdatoer, og når en afstemning er udløbet, så gemme det samlede resultat (f.eks. i ekstra felter i mypol ovenfor) fremfor at gemme de enkelte stemmer.
Hvis du gemmer svar i en varchar (specielt med størrelsen 255), så kunne det i øvrigt tyde på at det ikke var en afstemning, du laver, men snarere et spørgeskema?
Så har jeg misforstået din afstemningSvar tabel - jeg troede at det var en record per svar afgiver, men jeg kan forstå at det er en record per svar mulighed.
Og så kan du naturligvis ikke gemme hverken bruger eller tid.
Jeg finder det uhensigtsmæssigt at man kan undlade at tilknytte et afstemsninsgSvar til et afstemningsSpoerg og så sætter de default 0 ind som måske eksisterer måske ikke eksistsrer.
Jeg havde tænkt mig kun at benytte en Cookie og ikke tjekke IP, men er ikke helt sikkert på hvad der er bedst ?
Hvis jeg KUN sætter en cookie, tjekker jeg bare om cookien er sat når afstemningen skal loades.
Hvis jeg skal logge IP, kan jeg vel ikke (som jeg har gjort) nøjes med at logge hvor mange stemmer de enkelte svarmuliger har fået, men er nødt til at lave en tabel til de enkelte svar. Der kan jeg gemme IP, tidspunkt osv.
Jeg tvivler på, at mine svar kommer til være længere end 255 characterer, derfor varchar.
Ved afstemninger, ville jeg normalt antage, at man kun bør stemme en gang. Man behøver naturligvis ikke gemme de enkelte stemmer, men man er næsten nød til at registere om folk har stemt eller ej...
Hvis man kun kører en enkelt afstemning (eller to) adgangen, så kan man selvfølge lig også bare sætte en "hasvoted" med afstemningsværdien som indhold og checke for den.
Det er ikke nok at logge IP-nummeret. Mange (typisk i virksomheder, men også i bolig-/bynet) sidder bag samme IP-nummer, så du skal kunne identificere den enkelte browser.
Du kan enten lave et "unikt ID" pr browser (~bruger) og gemme server side i en ny tabel hvilke afstemninger brugeren har stemt i ELLER du kan som cookie gemme hvilke afstemninger den browser, der kommer forbi, har deltaget i.
Hvis du gemmer cookies pr afstemning, bør disse ikke leve længere end afstemningen kører...
Jeg er godt klar over, at folk altid kan snyde når det ikke er brugerbaseret (gid det var, det ville være noget nemmere).
Er lidt i tvivl om hvilket der er bedst. Hvis jeg logger IP også, så kan flere computere med samme IP jo ikke alle stemme.
Hvis jeg ikke logger IP kan folk slette deres Cookie og folk der ikke accepterer Cookies kan stemme løs (men så kan jeg vel forhindrer dem i at stemme overhovedet ?).
arne_v: "Du er opmærksom på at hverken cookie eller IP forhindrer samme person i at stemme flere gange ?"
Jeg er i hvert fald, men hvis ALLE skal kunne stemme, så er det stort set umuligt at forhindre. Alternativet skulle jo være at lave en brugerklub, hvor kun registrerede medlemer (der var logget ind), kunne stemme - og det er vist overkill som jeg læser udfordringen her :)
Jeg vil gerne have at ALLE skal kunne stemme, ligesom på fx. www.dr.dk. Hvis jeg skal forhindre dem i bare slette deres Cookie, hvordan laver man så et browser/bruger Id ? Er det en kombination af IP og ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.