Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/Javascript/MySQL] System Ocen
Forum PHP.pl > Forum > Przedszkole
necro
Witam.
Mam pewien problem z systemem ocen (plus i minus), nie wiem dokładnie jak to zrobić.
Chciał bym zrobić taki system ocen jak na www.maxmix.pl/movie-10543.html

Ale nie wiem w ogóle jak to jest zrobione, może ktoś mi pomóc? lub gdzie znajdę jakieś wskazówki?

Pozdrawiam
.radex
Człowieku, bez przesady....

Po prostu za kliknięciem dodajesz do bazy ilość kliknięć PLUS bądź MINUS a następnie z tych wartości obliczasz sobie w dowolny sposób wartość...

Trochę więcej samodzielności i konkretnych pytań.
necro
Zrobiłem to już, ale nie wiem jak zrobić aby nie przeładowywało strony i jak obliczyć średnią w skali 10

Pozdrawiam
.radex
użyj AJAX-a

"średnią w skali 10" - z matematyki uciekałeś?
necro
Musisz obrażać?
Nie nie uciekłem, tylko nie wiem jak to w php zrobić.
.radex
Dobra, dobra, wyluzuj.

Powiedz jakim sposobem chcesz to napisać (bo mi dwa przyszły na myśl) to powiem jak to zaimplementować.
necro
Nie wiem jakim sposobem ale na razie zrobiłem tak:
w Tabeli filmiki dodałem rekordy plus(int11) i minus(int11).
Głosy dodaje tak:
Kod
if($_COOKIE[$_GET[id]]){
    
echo "<center> Nie możesz dodać więcej głosów na ten dowcip!  </center>";
    
}else{

if(!isset($_COOKIE[$_GET['id']])){
    setcookie( $_GET['id'], $_GET['id'], time()*3600*12);
    }else{
    setcookie( $_GET['id'], "voted", time()*3600*12);
    }
    
    $sql = "SELECT * FROM filmiki WHERE id = '$_GET['id']'";
    $res = mysql_query($sql);
    $row = mysql_fetch_array($res);
    
    if($_GET['glos'] == "plus"){
        
        $plus = $row['plus']+1;
        $sql = "UPDATE filmiki SET plus='$plus' WHERE id='$_GET['id']'";
        $res = mysql_query($sql);
    
    echo "<center> Twój głos został dodany! </center>";
    }
    
    if($_GET['glos'] == "minus"){
        
        $minus = $row['minus']+1;
        $sql = "UPDATE filmiki SET minus='$minus' WHERE id='$_GET['id']'";
        $res = mysql_query($sql);
    
    echo "<center> Twój głos został dodany! </center>";
    }

    
    
}


Pozdrawiam
marcio
Hmm... ale z tego co widze to ty zwiekszasz lub zmiejszasz zmienna z bazy i na nowo ja zapiusjesz najlatwiej bedzie zrobic tak robisz <select> z option on 1-10 dodajesz do bazy za pomoca insert into nie update aby zrobic srednia liczysz wszystkie oceny od danego filmu dzielisz perzez wszystkie oceny i zaokroglasz za pomoca round() albo ceil() zalezy jak chcesz zaokroglac bo tak jak ty to robisz to chyba nie mozna obliczyc sredniej tak jak chcesz w sumie moze sam napisze system ocen do art'ow w cms
necro
Wolał bym zrobić tak jak jest teraz, nie da jakoś rady?
Pozdrawiam
Dzięki za info o zaookrągleniu liczby

PS. Chciałem tylko plus i minus no i żeby obliczało średnią sad.gif
marcio
Nie wiem jak moglbys obliczac srednia przy twoim systemie nie przychodzi mi nic do glowy chyba ze bedziesz robis roznice pozytywnych i negatywnych ocen i to wsio ale cos nie teges.....smile.gif
necro
Wiesz, nie znam najlepiej PHP, szukałem wszędzie ale co znalazłem to tylko gwiazdkowe systemy ocen a ja takich nie chce.

Pozdrawiam
simple programmer
Do obliczania średniej służy w Mysql funkcja AVG.
Kod
SELECT AVG(ocena) FROM oceny as srednia
.radex
Gwiazdkowe systemy oceny opierają się na praktycznie tej samej zasadzie.
marcio
Sorki za OT ale chcialem zapytac tez sobie zrobie system ocen tak jak mu to opisalem tylko mam pytanko bo wysylanie cookie nie jest zabardzo bezpieczne zapisywac w bazie i sprawdzic czy dany user juz dodal czy samo cookie wystarcz??

@simple programmer i jak to potem wyswietlic sorki za takie pytanko ale sql az tak dobrze nie znam smile.gif
Kicok
Po pierwsze to zwiększać ilość plusów/minusów w bazie danych możesz przy pomocy jednego zapytania, np:
  1. UPDATE tabela SET kolumna = kolumna + 1 WHERE warunek = 'cośtam'



Do wyświetlenia oceny potrzebujesz z bazy: ilość ocen ( plusy i minusy ) oraz ilość plusów.
A potem już matematyka: ile procent wszystkich głosów to plusy i zamiana na skalę 1-10 ( 0% = 1; 100% = 10 )

Możesz to zrobić w PHP, lub już na poziomie zapytania SELECT
marcio
@necro bede dobry masz napisalem sobie taki system ocen dla moich art'ow nie mozna oceniac 2 razy nie wysylac cookie bo mozna oszukiwac o jest srednia ocen
  1. <?php
  2. $oceny = mysql_query('select ocena from oceny where aid = '.(int)$_GET['id'].'', $db);
  3. $wszystkie = mysql_num_rows($oceny);
  4.  
  5. if($wszystkie == 0) $ilosc_ocen = '<b style="color:#FF0000">Nie ma ocen</b>';
  6. else $ilosc_ocen = 'Lacznie ocen: '.$wszystkie;
  7.  
  8. while($razem = mysql_fetch_assoc($oceny)) $lacznie += $razem['ocena'];
  9. $srednia = round($lacznie/$wszystkie, 1);
  10.  
  11. $czy_ocenil = mysql_query('select ocena,dodal from oceny where aid = '.(int)$_GET['id'].' and dodal = "'.mysql_real_escape_string($_COOKIE['name']).'" limit 1', $db);
  12. $jaka = mysql_fetch_assoc($czy_ocenil);
  13.  
  14. <table width="100%">
  15. <form action="'.$_SERVER['PHP_SELF'].'?strona='.$strona.'&action=pokaz&id='.$_GET['id'].'&autor='.$_GET['autor'].'" method="post">
  16. <tr><td align="center" bgcolor="#eeeeee" height="18"><b style="color: #000000">Oceny</b></td></tr>');
  17.  
  18. if(mysql_num_rows($czy_ocenil) == 0)
  19.  
  20. echo('<tr><td align="center">Podaj swoja ocene 
  21. <select name="ocena">
  22. <option value="1">1</option>
  23. <option value="2">2</option>
  24. <option value="3">3</option>
  25. <option value="4">4</option>
  26. <option value="5">5</option>
  27. <option value="6">6</option>
  28. </select>
  29. <input type="submit" name="ocen" value="Ocen" style="background-color:#ECECEC; color:#000000; border: 1px solid blue;"></td>
  30. </tr>
  31. </form>');
  32.  
  33. else echo('<tr><td align="center">Oceniles na: <b style="color: #000000">'.$jaka['ocena'].'</b></td></tr>');
  34.  
  35.  
  36. echo('<tr><td align="center">'.$ilosc_ocen.'</td></tr>
  37. <tr><td align="center">Srednia ocen: '.$srednia.'</td></tr>
  38. </table>');
  39.  
  40. if(isset($_POST['ocen'])) {
  41.  
  42. $id = (int)$_GET['id'];
  43. $ocena = $_POST['ocena'];
  44. $dodal = mysql_real_escape_string($_COOKIE['name']);
  45. $data = date('j/n/Y H:i:s');
  46.  
  47. if(mysql_query("insert into oceny(aid,ocena,dodal,data) values('$id', '$ocena', '$dodal', '$data')", $db)) echo('<script>alert("Ocena zostala dodana")</script>');
  48.  
  49. }
  50. ?>

Czy ktos moze mi powiedziec czy ten kod jest optymalny jesli nie jest to prosze o pokazania jak go zooptymalizowac smile.gif
.radex
Cytat
Sorki za OT ale chcialem zapytac tez sobie zrobie system ocen tak jak mu to opisalem tylko mam pytanko bo wysylanie cookie nie jest zabardzo bezpieczne zapisywac w bazie i sprawdzic czy dany user juz dodal czy samo cookie wystarcz??


baza + ciacha

baza = pewność, że nie oszukuje
ciacha = ograniczenie zapytań do bazy.
marcio
Cytat
baza + ciacha

baza = pewność, że nie oszukuje
ciacha = ograniczenie zapytań do bazy.

WLasnie zrobilem sprawdzanie na bazie mam pewnosci ze ktos nie oszuka a tak jak mi powiedzieli w innym temacie o 1 zapytanie wiecej baza nie zdechnie smile.gif
.radex
No tak, ale przecież chodzi o to, żeby nie zagłosowali drugi raz. Walisz ciacho i nie musisz za każdą odsłoną dawać tego jednego zapytania. A jak ciacha nie będzie, to dopiero wtedy się musisz upewnić.

Przy większej aplikacji (więcej takich "akcji") możesz na tym zaoszczędzić 2-3 zapytania na odsłonę. Przy dużej ilości userów jakaś różnica będzie (nieduża, ale zawsze).
marcio
Cytat
No tak, ale przecież chodzi o to, żeby nie zagłosowali drugi raz

No to tez ni zaglosuje 2 razy smile.gif

Cytat
Walisz ciacho i nie musisz za każdą odsłoną dawać tego jednego zapytania. A jak ciacha nie będzie, to dopiero wtedy się musisz upewnić.

To to0 ja tez wiem ale koledzy upewnili mnie ze nie robi to roznicy przy 2-3k user'ow smile.gif

A tak pozwole zapytac a w IPB czyli na tym forum jak sie zabezpiecza sondy?
Ciacha czy baza??
.radex
Moim zdaniem warto oszczędzać wszędzie, gdzie nie wiąże się to z dużą ilością kodu do napisania. Nie jestem w stanie potwierdzić tego żadnymi testami, ale wydaje mi się że przy dużym skrypcie i dużej ilości userów różnica dzięki takim pierdołkom będzie.

Ciacha + baza. Mówiłem przecież.
marcio
Po co ciahca + baza albo jedno albo drugie a nie 10 rzeczy chcesz potestowac:
http://www.marcio.szu.pl/czyt_art.php?stro...p;autor=uw_test

Login: uw_test
Haslo: uw_test
.radex
Ehhh... Już to wytłumaczyłem.

Baza po to, żeby mieć PRAWDZIWĄ pewność, że już głosowałeś

A ciacha po to, żeby ograniczyć zapytania do bazy i zrobić to po stronie klienta.

Rozumiesz?

Ciacha po jakimś czasie wygasają. Można je też ręcznie usunąć. Po to dodawanie tych danych do bazy. A jeśli ciastko jest (np. zaglosowal=tak), to dopóki nie będzie próbował zagłosować, nie ma sensu pakować zapytania do bazy.
marcio
Nie rozumiem twojej toerii moglbys to pokazac na moim kodzie??
Chodzi ci o to ze gdy wysyla pierwszy glos wysylam ciacho gdy ciacha nie ma bo wygaslo albo ktos usunolem przed wyswietleniem forma sprawdzam czy jest ciacho jesli go nie to robie zapytanie czy dana osoba juz dodala odpowiez w sumie teoria dobra jak mi sie bedzie chcialo to moze zmienie smile.gif ale dzieki
.radex
O to właśnie chodzi tongue.gif
marcio
W sumie to to jest ok moze zrobie cos takiego tylko jak ktos oceni 50 art'ow to bedzie mial 50 cookie a w cookie bede musial wysylac id art'a moze to zmienie w sumie to jest 5 min roboty :0
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.