Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] System Ocen, jak ?
Forum PHP.pl > Forum > Przedszkole
fredzio90
otóż chciałbym zrobić ranking DJ-ow, i chciałbym aby on polegał na takim systemie oceniania. PRzykłądowo mamy 100 wpisów ( DJ-i ) każdy ma na swoim koncie 1 głos ( 1 głos == 1 pkt ) i każdy z tych wpisów ma 1 % głosów...

przykład: http://topdj.pl/index.php?ranking=pDJ

i jeżeli moglibyście podpowiedzieć mi jak mógłbym zrobic opcję wycofywania głosów.... ( Cookie odpada )
Mazur_pl
Robisz dwie tabele w bazie danych.
W jeden trzymasz wszystkich DJ'ów:

+-----+-------+
+--id-+nazwa+
+-----+-------+

potem drugą tabelę oceny:

+-----+--------+-------+
+-id--+-id_dj-+---ip---+
+-----+--------+-------+

Potem robisz sobie dwa pliki, w jednym wypisujesz sobie dj'ów w taki sposób:

Nazwa -|- ocena -|- Zagłosuj -|-

Zagłosuj będzie linkiem do tego drugiego pliku w sensie:

<a href="glosuj.php?id_dj=$id">Zagłosuj</a>

Potem w pliku glosuj.php robisz sobie dodanie do bazy.

Dałem ci przykład, myślę że z resztą sobie poradzisz , jak nie to pytaj.
fredzio90
ale wiem jak to wykonać, bo nawet do bazy bede doawał nick usera ktory będzie głosował ( tylko dla zalogowanych ) ale mi chodzi tutaj o dokładny kodzik który będzie przeliczał te dodawane głosy na te stopnie % aby suma WSZYSKICH ocen procentowych w bazie wyniosła 100. np ja mam odmienny system, który się do tego nei nadaje, a wygląda on tak:

  1. <?php
  2. $query = "SELECT il_glosow,srednia_ocena FROM $rank_club_tbl WHERE title='$id'";
  3. $res = mysql_query($query);
  4. $r = @mysql_fetch_array($res);
  5. $ocena = round((($r['srednia_ocena']/10)*$r['il_glosow'] + $note/10 )*10 / ($r['il_glosow'] + 1), 2);
  6. $query = "UPDATE $rank_club_tbl SET il_glosow=il_glosow+1, srednia_ocena=$ocena WHERE
     title='$id'"
    ;
  7. mysql_query($query);
  8. ?>


i chodzi mi o taki jaki wymieniłem w 1 poście... gdzie demko podałem ;D
Cienki1980
Nie wiem czy do końca rozumiem, ale chyba wykorzystanie proporcji wystarczy na Twoje potrzeby.

suma_wszystkich_glosow - 100%
ilosc_glosow_na_jednego - x %

Z czego wychodzi
x=(ilosc_glosow_na_jednego*100)/suma_wszystkich_glosow;
fredzio90
ostatnie pytanie, jak zmienić tą liczbę na liczbe z 2 miejscami po przecinku, np:

4.24 %
questionmark.gif
Cienki1980
Zapoznaj się z funkcją round
fredzio90
oki dałem coś takiego:

  1. <?php
  2. $sql = mysql_query("SELECT * FROM $rank_dj_tbl WHERE typ='ok'");
  3. $numb = @mysql_num_rows($sql);
  4. $il_glosow = $r['il_glosow'];
  5.  
  6. $rate = ($il_glosow*100)/$numb;
  7. ?>


i pokazuje jako:

  1. <?php
  2. '.round($rate, 20).'
  3. ?>


i gdy klikam na głosuj ( funckja vote_sql )

  1. <?php
  2. function vote_sql() {
  3. global $rank_dj_tbl, $id, $PHP_SELF, $cmd;
  4. $sql = mysql_query("UPDATE $rank_dj_tbl SET il_glosow=il_glosow+1 WHERE title='$id'");
  5.  
  6. header("Location: $PHP_SELF");
  7.  
  8. }
  9. ?>


to dodaje ten punkt, ale poten gdy mam np. 2 wpisy, dodaje dodaje i suma tych głosów nie jest równa 100 % tylko dodałem klika głosów i jest np 150 i 150....

a cała funckja wygląda tak:

  1. <?php
  2. function top30() {
  3. global $rank_dj_tbl, $id, $PHP_SELF;
  4.  
  5. $sql = mysql_query("SELECT * FROM $rank_dj_tbl WHERE typ='ok' LIMIT 30");
  6. $numb = @mysql_num_rows($sql);
  7.  
  8. if($numb=='0') {
  9. echo '<br /><center>Brak Dodanych DJ-ow</center><br />';
  10.  
  11. } else {
  12.  
  13. echo '<table width="97%" align="center" border="0" frame="box">
  14. <tr>
  15. <td bgcolor="'.$color[6].'" class="uni_01" align="center"><b><font color="'.$color[7].'">Pseudo:</td>
  16. <td bgcolor="'.$color[6].'" class="uni_01" align="center"><b><font color="'.$color[7].'">Ocena:</td>
  17. <td bgcolor="'.$color[6].'" class="uni_01" align="center"><b><font color="'.$color[7].'">Głosuj:</td>
  18. </tr>';
  19. $sql = mysql_query("SELECT * FROM $rank_dj_tbl WHERE typ='ok'");
  20. $numb = @mysql_num_rows($sql);
  21. while ($r = mysql_fetch_array($sql)) {
  22.  
  23. $pseudo = $r['title'];
  24. $il_glosow = $r['il_glosow'];
  25.  
  26. $rate = ($il_glosow*100)/$numb;
  27.  
  28. if($a==5) {
  29. $bg = $color[6];
  30. $a = 0;
  31. } else {
  32. $bg = $color[5];
  33. $a = 5;
  34. }
  35.  
  36.  
  37.  
  38. echo '<tr>
  39. <td bgcolor="'.$bg.'" class="uni_01" align="center"><a href="'.$PHP_SELF.'?cmd=profil&id='.$pseudo.'">'.$pseudo.'</a></td>
  40. <td bgcolor="'.$bg.'" class="uni_01" align="center">'.round($rate, 20).'</td>
  41. <td bgcolor="'.$bg.'" class="uni_01" align="center"><a href="'.$_SERVER[PHP_SELF].'?cmd=glosuj&id='.$pseudo.'">Głosuj</a></td>
  42. </tr>
  43. '; 
  44. }
  45.  
  46. echo "</table>";
  47.  
  48. }
  49.  
  50.  
  51.  
  52. }
  53. ?>


i niestety suma wszystkich ocen nie jest równa 100

pomoglibyście ? smile.gif
uli
$numb u Ciebie to ILOŚĆ WPISÓW, a nie suma głosów. Oczywistą sprawą jest że nie daje to 100 smile.gif

U Ciebie np:

id | id_DJ | il_glosow

1,1,4
2,2,22
3,3,3

dla dj nr 1 da : 4*100/3.

Zsumuj najpierw po il_glosow.

  1. <?php
  2. $q = "SELECT SUM(il_glosow) as suma from $rank_dj_tbl";
  3. $w = mysql_query($q);
  4. $suma_wszystkich_glosow = $w['suma'];
  5. ?>


I dziel przez to.
fredzio90
źle zinterpretowałem podpowiedz ;D

ale teraz wygląda coś takiego:
  1. <?php
  2. $q = "SELECT SUM(il_glosow) as suma from $rank_dj_tbl";
  3. $w = mysql_query($q);
  4. $suma_wszystkich_glosow = $w['suma'];
  5.  
  6. $sql = mysql_query("SELECT * FROM $rank_dj_tbl WHERE typ='ok'");
  7. $numb = @mysql_num_rows($sql);
  8. while ($r = mysql_fetch_array($sql)) {
  9.  
  10. $pseudo = $r['title'];
  11. $il_glosow = $r['il_glosow'];
  12.  
  13.  
  14. $rate = ($il_glosow*100)/$suma_wszystkich_glosow;
  15. ?>


i pokazuje jako $rate lecz wywala 2 błędy:

Cytat
Warning: Division by zero in /home/accounts_f/fredzio90/public_html/module/rank_dj.inc.php on line 33

Warning: Division by zero in /home/accounts_f/fredzio90/public_html/module/rank_dj.inc.php on line 33


i nic nie pokazuje w ocenach..

..

..

pomożecie questionmark.gif smile.gif

już rozwiązałem problem, dałem coś takiego:

  1. <?php
  2. $query_show = mysql_query("SELECT * FROM $rank_dj_tbl;");
  3. while($row = mysql_fetch_assoc($query_show)) {
  4. $suma += $row['il_glosow'];
  5. }
  6. ?>


i dzielnie wykonałem tak:

$rate = ($il_glosow*100)/$suma;


i zaokrągliłem jako
  1. <?php
  2. round($rate, 2);
  3. ?>
i HULA biggrin.gif
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.