22. august 2009 - 02:00Der er
18 kommentarer og 1 løsning
Gøre mine ratings unikke, så brugerne kun kan stemme én gang
Godaften folkens..
Jeg har en række opskrifter hvor mine brugere kan bedømme med en rating fra 1-5. Herefter bliver gennemsnittet regnet ud og udskrevet. Jeg har desuden (troede jeg) gjort således at brugerne kun kan stemme én gang pr opskrift - men her har jeg opdaget at jeg sov, da jeg lavede denne del..
Følgende tre rækker i min tabel har betydning for ratingen: - ratingcounts: Tæller hvor mange personer, der har stemt - ratingaverage: Tæller det samlede antal ratings - ratingauthor: Noterer hvilken bruger, der har stemt
Måden hvorpå jeg opdaterer tabellen er således: <?php mysql_query("UPDATE opskrifter SET ratingaverage = ratingaverage + $_POST[rating] WHERE id='$newratingid'") or die(mysql_error()); mysql_query("UPDATE opskrifter SET ratingcounts = ratingcounts + 1 WHERE id='$newratingid'") or die(mysql_error()); mysql_query("UPDATE opskrifter SET ratingauthor = ".$_SESSION[SESS_MEMBER_ID]." WHERE id='$newratingid'") or die(mysql_error()); ?>
Problemet er her at den sidste række "ratingauthor" bliver opdateret fra hver bruger, der stemmer. Hvis brugeren med brugerid 87 afgiver sin rating, bliver feltet sat til at være lig med 87. Dermed kan personen ikke stemme igen, men det er kun midlertidigt indtil at en ny person afgiver en stemme - for så bliver feltet overskrevet/opdateret igen.
Men hvordan løser jeg dette problem på den smarteste og nemmeste måde? Kan man eksempelvis gemme flere bruger id's i den samme række i tabellen, blot adskilt med et komma?
Du er jo nødt til at gemme info om hvilke brugere, der har afgivet stemme på hvilke opskrifter.
Så hvad med at lave en særskilt tabel HARSTEMT, som bare indeholder to felter BRUGER_ID og OPSKRIFT_ID og så tilføje data hvergang en bruger stemmer.
Før en bruger kan stemme på en given opskrift, skal du så sikre dig, at denne unikke kombination af BRUGER_ID og OPSKRIFT_ID ikke findes i tabellen HARSTEMT.
Ja, lakridserne, det har du fuldstændig ret i. Men set i lyset af, at det er et site med opskrifter, og ikke Pentagons site, antager jeg, at meningen er, at brugerne ikke skal stemme flere gange ved en fejltagelse :o)
Klart nok, lakridserne, og ved nærmere eftertanke så vil jeg da også anbefale løsningen med tabellen. Den vil jo også forhindre blackhats i, for sjovs skyld, at sabotere afstemningerne.
Ja naturligvis jesperhgh.. Det er også det jeg allerede gør, men her bliver informationen så overskrevet..
Havde bare håbet man kunne gøre det på en smartere måde end ved at oprette en ny tabel kun til det, men jeg prøver mig lidt frem og vender så nok tilbage senere i dag ;)
Og ja, jeg foretrækker også selv tabeller fremfor cookies til dette, da det senere hen bliver vigtigt at der ikke er snydt med ratingen ;)
Før en bruger kan stemme på en given opskrift, skal du så sikre dig, at denne unikke kombination af BRUGER_ID og OPSKRIFT_ID ikke findes i tabellen HARSTEMT.
Har du en smart måde at gøre det på så ;) ?
Jeg har oprettet en tabel ved navn ratings med følgende felter: - id, parent_id, type_id, userid
Her er parent_id id'et på den pågældende opskrift. Jeg har dog også andet end opskrifter som man kan bedømme og derfor har jeg også oprettet type_id, så man kan se hvad man har med at gøre..
Jeg har prøvet mig frem med noget ala dette:
<?php $queryrating = mysql_query("SELECT * FROM ratings WHERE parent_id='".$_GET['id']."'") or die(mysql_error());
if($rowrating['userid'] == $_SESSION['SESS_MEMBER_ID']){ <-- SÅ HAR MAN ALLEREDE STEMT --> } ?>
Problemet er bare her at rowrating['userid'] kun udvælger en enkelt række i tabellen.. Dvs hvis brugerid 6 og brugerid 2 har stemt på den samme opskrift, så udvælger den kun et af disse brugerid (f.eks. brugerid 2), og brugeren med id 6 kan derfor godt stemme igen..
CITAT START Ja naturligvis jesperhgh.. Det er også det jeg allerede gør, men her bliver informationen så overskrevet. CITAT SLUT
Nej, nej doncarnage, det er ikke det du allerede gør. Det du allerede gør, er at OPDATERE (altså ændre) en record i en tabel - det du skal er at TILFØJE en record hver gang en bruger for første gang stemmer på en ret.
PS: Du skal jo forstå, at en sql UPDATE kun ændrer den aktuelle record. du skal jo INSERT alle afstemningsforsøg, således at de bliver tilføjet tabellen:
Syntaksen er:
INSERT INTO table_name VALUES (value1, value2, value3,...)
Det er jo fordi du skal gøre de felter der skal være unikke til en kombineret primær nøgle. Udover det skal du lave dit resultat til et assosiativt array.
Har i hvert fald fået det til at virke nu på følgende måde (i grove træk):
<?php $ratingcount = mysql_query("SELECT id FROM ratings WHERE parent_id='".$_GET['id']."' AND userid='".$_SESSION['SESS_MEMBER_ID']."'") or die(mysql_error()); $ratings = mysql_num_rows($ratingcount);
if($ratings == 1){ -> SÅ HAR MAN ALLEREDE STEMT } ?>
Til de af jer, der gerne vil have points - så må i lige smide et svar.. Så vil jeg forsøge at fordele efter hvem jeg mener fortjener mest =)
Jeg er da ked af at høre, at min viden ikke kunne bidrage til dette problems løsning. Specielt er jeg ked af at at brugere som doncarnage er som vidende
Hvorfor føler du dig pludselig stødt nu? Har da aldrig sagt jeg ikke kunne bruge din hjælp til noget.. Faktum er bare at du blev ved med at køre i noget som ikke var problemet og du derfor nok misforstod mig ;)
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.