Avatar billede doncarnage Nybegynder
22. august 2009 - 02:00 Der 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?
Avatar billede jesperhgh Nybegynder
22. august 2009 - 07:43 #1
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.
Avatar billede jesperhgh Nybegynder
22. august 2009 - 07:49 #2
PS:

Du kunne jo også bruge cookies.
I så fald kunne navnet på cookien f.eks. være STEMT+OPSKRIFT_ID.
Avatar billede lakridserne Nybegynder
22. august 2009 - 08:25 #3
Den nye tabel ville jeg bruge, da brugeren jo bare kan slette cookiesne og dermed stemme igen.
Avatar billede jesperhgh Nybegynder
22. august 2009 - 09:56 #4
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)
Avatar billede lakridserne Nybegynder
22. august 2009 - 10:12 #5
Ja. Jeg oplyser bare om at det er relativ nemt at omgå cookies
Avatar billede jesperhgh Nybegynder
22. august 2009 - 10:32 #6
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.

Så vi er helt enige.
Avatar billede doncarnage Nybegynder
22. august 2009 - 12:41 #7
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 ;)
Avatar billede ksoren Nybegynder
22. august 2009 - 12:45 #8
Det, med sådan en tabel, er vel måden at gøre det på. At gemme flere id'er i en række adskilt med komma, er en skidt idé.
Avatar billede doncarnage Nybegynder
22. august 2009 - 13:17 #9
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..
Avatar billede jesperhgh Nybegynder
22. august 2009 - 13:21 #10
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.
Avatar billede doncarnage Nybegynder
22. august 2009 - 13:31 #11
Ah yes, heh.. Potato Potato :D! Men ej, ved godt hvad du mener og jeg tilføjer også nu til den nye rating tabel i stedet for at opdatere..

Men havde du en lille fif til #9 ;) ?
Avatar billede jesperhgh Nybegynder
22. august 2009 - 13:33 #12
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,...)
Avatar billede doncarnage Nybegynder
22. august 2009 - 13:36 #13
Det har jeg også forstået? Forstår til gengæld ikke hvorfor du bliver ved med at køre i det når det ikke er det der er problemet ;)

Nedenstående er måden jeg tilføjer til min ratings tabel:

<?php
mysql_query("INSERT INTO ratings (parent_id, type_id, userid) VALUES('$newratingid', '2', '".$_SESSION[SESS_MEMBER_ID]."') ") or die(mysql_error()); 
?>
Avatar billede ksoren Nybegynder
22. august 2009 - 14:07 #14
Når du tjekker om posten findes i rating-tabellen, så skal du lige huske at sætte brugerid på din where også ...

[code]WHERE parent_id=$id AND userid=$userid[/code]

og hvis dén post findes, så har brugeren allerede stemt på lige præcis denne.
Avatar billede lakridserne Nybegynder
22. august 2009 - 14:08 #15
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.
Avatar billede doncarnage Nybegynder
22. august 2009 - 14:22 #16
Jepper ksoren - det opdagede jeg også selv ;)

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 =)
Avatar billede jesperhgh Nybegynder
22. august 2009 - 14:22 #17
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
Avatar billede doncarnage Nybegynder
22. august 2009 - 14:30 #18
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 ;)
Avatar billede jesperhgh Nybegynder
23. august 2009 - 03:36 #19
Nu er jeg ædru igen: Undskyld, doncarnage ;o)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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