Avatar billede googolplex Novice
05. august 2003 - 22:18 Der 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)
);

Men er det helt ude i skoven eller ?
Avatar billede arne_v Ekspert
05. august 2003 - 22:24 #1
Jeg mener ikke at afstemningSvar.spoergID skal have en default.

Men ellers virker det meget tilforladeligt.

Hvad er resultat ?

Og det er en anonym afstemning da der ikke gemmes bruger !?

Og du er ikke interesseret i at gemme tid for stemme afgivelse !?
Avatar billede googolplex Novice
05. august 2003 - 22:28 #2
Hvorfor skal afstemningSvar.spoergID ikke have default ?

Resultat er det antal stemmer det pågældende svar har fået.

Ja, den er anonym, tror aldrig jeg får nok brugere til det andet :(

Jo, måske skal tiden med, men så skal jeg vel bygge det helt anderledes op ?
Avatar billede mahler Nybegynder
05. august 2003 - 22:33 #3
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.

create table mypol ( id integer unsigned, question char(60), answr1 char(30), answr2 char(30), answr3 char(30))

og hvor "votes" kunne se således ud:

create table myvotes ( userkey integer unsigned, mypol.id, answr.choice);

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?
Avatar billede arne_v Ekspert
05. august 2003 - 22:37 #4
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.
Avatar billede arne_v Ekspert
05. august 2003 - 22:38 #5
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.
Avatar billede googolplex Novice
05. august 2003 - 22:40 #6
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.
Avatar billede mahler Nybegynder
05. august 2003 - 22:41 #7
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.
Avatar billede arne_v Ekspert
05. august 2003 - 22:44 #8
Du er opmærksom på at hverken cookie eller IP forhindrer samme
person i at stemme flere gange ?
Avatar billede mahler Nybegynder
05. august 2003 - 22:47 #9
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...
Avatar billede googolplex Novice
05. august 2003 - 22:48 #10
Hvordan forhindrer jeg det så (bedst) ?

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 ?).
Avatar billede mahler Nybegynder
05. august 2003 - 22:50 #11
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 :)
Avatar billede googolplex Novice
05. august 2003 - 22:58 #12
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 ?
Avatar billede mahler Nybegynder
05. august 2003 - 23:00 #13
unixtime + ipnummer burde være rigeligt tli at gøre det unikt.
Avatar billede mahler Nybegynder
05. august 2003 - 23:01 #14
(unixtime alene ville langt de fleste tilfælde også være nok...)
Avatar billede arne_v Ekspert
05. august 2003 - 23:03 #15
Du kan ikke forhindre dem i at slette deres cookie.

Eller stemme fra en anden PC.

Eller i at få en anden dynamisk IP til samme PC.

Sådan er det bare.
Avatar billede googolplex Novice
05. august 2003 - 23:03 #16
mahler: Jamen, hvordan forhindrer det dem i at stemme igen ? Jeg gemmer det i et svar, men næste gang de går derind, har de jo ikke det samme ID ?!
Avatar billede googolplex Novice
05. august 2003 - 23:05 #17
Hvis jeg nu KUN bruger Cookies, hvordan forhindrer jeg så, at folk der slet ikke accepterer Cookies kan stemme løs ?
Avatar billede mahler Nybegynder
05. august 2003 - 23:05 #18
hvis du vil gemme id'er, så sætter du en cookie med deres id.
Du skal kun lave nyt id, hvis de ikke har cookien med en værdi allerede.
Avatar billede arne_v Ekspert
05. august 2003 - 23:06 #19
Jeg mener at du kan give dem cookien først og så først lade dem stemme
når de har accepteret cookien.
Avatar billede mahler Nybegynder
05. august 2003 - 23:06 #20
ellers skal du jo checke i en tabel med "afstemning, brugerid'er" om de har stemt i den afstemning, der kører eller ej.
Avatar billede googolplex Novice
05. august 2003 - 23:07 #21
mahler: Ok, men IP logning bruger man vel netop til at forhindrer at folk der IKKE accepterer cokkies (eller sletter dem) kan stemme løs ?
Avatar billede googolplex Novice
05. august 2003 - 23:14 #22
Ok, jeg laver det rent cookie-baseret.

MEN, hvordan forhindrer jeg folk der slet ikke accepterer cookies i at stemme ? Kan man tjekke om folk accepterer cookies ?
Avatar billede mahler Nybegynder
05. august 2003 - 23:16 #23
prøv at sætte cookien, og lykkedes det ikke (dvs. kan du ikke læse den efterfølgende) får de ikke lov at stemme...
Avatar billede googolplex Novice
05. august 2003 - 23:18 #24
Så må vi bare håbe at de fleste accepterer cookies P
Avatar billede mahler Nybegynder
06. august 2003 - 07:29 #25
Hvis de ikke gør, kan du ikke gøre ret meget ved det.

Så længe der er tale om "first-party cookies", så tillader de fleste det, som udgangspunkt (http://www.potentialcreations.com/articles/cookies1.php).
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester