Har gjort mej ett eget lite skript där man kan rösta och undrar nu om nån har nån smart ide hur man kan få användare att bara rösta en gång. En lösning är ju att spara alla användarnamn i en databas som röstat, på varje specifik röstning. Men det känns som det blir onödigt stort i databasen om det skulle finnas tusentals användare. Så nån som har nån annan smart lösning?
Vill du inte spara röstningarna i en databas är det cookies du får använda. Dock så är det väldigt enkelt att ta sig förbi det skyddet genom att tabort cookien.
okej, men om man ska köra med databas, vilket är smidigaste sättet att bygga upp den på då?
User ((id) <ev andra attribut som namn, pass, et c>)
Poll ((Pollid) namn, <ev andra attribut som definierar omröstningen)
Voted ((id, Pollid)) <--- Finns en användare här så har han röstat i den poll:en.
Dvs om användare 1 röstar i poll 3 och 17 samt användare 3 röstar på poll 3 så ger detta upphov till följande rader i Voted.
((1, 3))
((1, 17))
((3, 3))
User ((id) <ev andra attribut som namn, pass, et c>)
Poll ((Pollid) namn, <ev andra attribut som definierar omröstningen)
Voted ((id, Pollid)) <--- Finns en användare här så har han röstat i den poll:en.
Dvs om användare 1 röstar i poll 3 och 17 samt användare 3 röstar på poll 3 så ger detta upphov till följande rader i Voted.
((1, 3))
((1, 17))
((3, 3))
Men vore det inte smidigare att få med VAD användaren röstat oxå? :q
Jag menar då smidigare än att ha en egen tabell för svaren?
En tanke bara, jag är inte helt haj på det här med modellering (eller vad det nu heter) :OO ;)
Det beror väl på om du vill att rösterna ska vara anonyma eller inte? Om det inte spelar roll vem som röstat på vad kan du lagra det enligt:
User ((id) <ev andra attribut som namn, pass, et c>)
Poll ((Pollid) namn, <ev andra attribut som definierar omröstningen)
Voted ((id, Pollid))
PollChoice ((id) text, antal) // där antal räknas upp med 1 för varje röst som inkommer
(samtidigt som den som röstat hamnar i Voted för den poll:en.
Annars får du istället göra något i stil med:
User ((id) <ev andra attribut som namn, pass, et c>)
Poll ((Pollid) namn, <ev andra attribut som definierar omröstningen)
PollAlt((Altid) text, Pollid) // Där Pollid knyter ett visst alternativ till en viss poll
Voted ((id, Altid)) //Genom att låta Altid vara löpnummer är rösten nu unikt bestämd till både poll och Alternativ.
Men det blir lite knepigare att se om en viss användare redan röstat i samma poll tidigare, då du måste joina Voted och PollAlt för att få fram vilka Pollid han/hon röstat på.
Du går ursäkta men jag förstår inte riktigt hur jag ska göra :), det spelar ingen roll om jag kan se vem som har röstat på vad eller inte, alla ska bara kunna rösta en gång på varje fråga. Om du kunde rita upp en bild på hur databasen ska se ut, eller ännu bättre om du kunde skriva ihop koden som skapar den, ex. CREATE TABLE vote ( id int ...., så vore det snällt :). Och tack för hjälpen så långt!
Det är lite beroende på hur "säker" du vill göra röstningen, men jag brukar göra besöksbaserade omröstningar så här:
När en besökare röstar så sätter du...
en cookie hos besökaren att den har röstat på den röstning med utgångsdatum ett år eller två in i framtiden.
Spara besökarens IP-nr och röstningstillfällets tidpunkt och datum i databasen.
Innan en röstning sker så kollar du...
Om det finns en cookie med registrering huruvida användaren har röstat eller ej. Om sant, neka röstning och visa resultatet
Om ingen cookiefil finns, kolla om IP-nr finns i databasen, om det är äldre än låt säga 1 eller 2 dygn tillåt röstning och radera den gamla posten, genomför den första iterationen.
Varför spara både cookie och i databasen?
Att bara spara en cookie låter en besökare ganska lätt fuska i omröstningen. Den behöver bara radera cookien via webbläsarens inställningar, eller köra ett script som röstar och raderar cookien.
Den data man sparar i databasen är dock skyddad och kan inte manipuleras av användaren(1). Men varför kolla datumet?
Jo, om du har besökare från stora företag/skolor etc så änvänder dessa ofta en enda publik IP-adress. Dessa kan alltså aldrig rösta om du sparar deras IP i databasen. Om du kollar datum så kan ingen från samma IP rösta samma dygn eller två, men efter det, och förutsatt att de använder en annan webbläsare.
Jag tycker att det är en ganska bra lösning som ger hyffsad balans, och gör det tillräcklig svårt för avskräcka röstfuskare.
mvh
Ingemar,
X.o.x webbutveckling
(1) Normalt sett, om man inte använder SQL-injection, vilket är dataintrång och dessutom skall man alltid skriva sin kod säkert -- i vilket fall ett helt annat kapitel...
Men det är bara inloggade användare som ska kunna rösta, så det borde räcka att lagra användarnamnet, men det jag är osäker på här hur databasen ska se ut.
252 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2