[ kelja @ 21.03.2010. 20:51 ] @
Pozdrav,
tabela izgleda ovako:
id | script_id | rating | ip

rating je, naravno, ocena scripta (od 1 do 5).

Upit koji bi trebalo da prikaze top 5 skriptova izgleda ovako:

Code:
SELECT script_id, AVG(rating) AS total_rating FROM rating GROUP BY script_id ORDER BY total_rating DESC LIMIT 5


ali to ne radi. Malo sam babrao po internetima (kanda ne dovoljno:)), i vidim da se savetuje upotreba ove funkcije.

Hvala unapred!

Hm, zapravo radi, sad sam taj upit provukao kroz phpmyadmin i izbaci lepo 5 rezultata... A na strani izbaci samo dva...
Bice da je problem u kodu koji sledi, a koji kaze ovako:
Code:

while ($row = $db->fetch($sql)) 
                {
                    $checkScript = $db->fetch($db->query("SELECT * FROM scripts WHERE id = '".$row['script_id']."'"));
                    if ($checkScript != NULL)
                    {
                        $script = new Script($row['script_id']);
                        $i++;
...pa ide html output...




[Ovu poruku je menjao kelja dana 21.03.2010. u 22:05 GMT+1]
[ Nikola Poša @ 21.03.2010. 21:27 ] @
A što nisi odma' te podatke iz tabele scripts dovukao sa tim prvim upitom, npr.:
Code:
SELECT s.*, AVG(r.rating) AS total_rating 
FROM scripts s, rating r
WHERE s.id = r.script_id
GROUP BY r.script_id 
ORDER BY r.total_rating DESC LIMIT 5

Ili tako nešto...
[ kelja @ 21.03.2010. 21:28 ] @
I da odgovorim sam sebi, da vas ne zbunjujem. :D
Sve fercera ok, ali...
Nasao sam gresku.
Lik koji je ovo radio (stvarno profi, cist kod, sve OOP, samo Smarty nije koristio :D) je zaboravio samo da pri uklanjanju nepostojecih skriptova, ukloni i njihov rejting. :)
Pri nailasku na prvi nepostojeci, a visoko ocenjeni id (skript), loop se prekida...

@Nikola,nije moja skripta, a ako krenem ozbiljnije da ''popravljam'', radice backup. :)

Pozdrav.
[ kelja @ 25.03.2010. 18:09 ] @
Malo mi zardjao SQL (navikao na Doctrine, sta ces), ali koliko kapiram, ti tabelu rejting konstantno popunjavas, zar ne? Tj. za svako glasanje za skriptu 15, dodace se jos jedan red u tabeli rating gde ce:
script_id = 15 | rating = 4 | ip = xxxxx

Ako sam dobro razumeo, onda je ovo totalno njakanje baze u prazno. Ja to radim na sledeci nacin:

tabela rating ima kolonu script_id , total, votes, percentage . Za svaki script_id , postoji samo jedan red u tabeli rating. Prilikom glasanja, ta tabela se samo update-uje.

Kolona total je ukupan broj poena koja je ta skripta dobila. Votes = koliko je njih glasalo.

Ako skripta ima 20 poena od 5 glasaca, percentage = 80 (%). Tu kolonu koristis da bi izvukao top 10 skripti na primer.


A ako te nisam dobro razumeo, zaboravi celu poruku


ps:
Nije OOP sve sto pise da jeste
[ kelja @ 25.03.2010. 21:32 ] @
Dragi Goste,
da, radi upravo tako kako si rekao.
Ma nije to moje, resio sam problem. (Zakrpio ono sto vec postoji ;))

Na slican nacin ovom tvom predlozenom sam resio rejting kad sam radio neku svoju skripticu, ALI, tada klijentu nije trebao ip (provera glasanja).

Pozdrav!
[ mitke013 @ 25.03.2010. 21:50 ] @
Citat:
kelja: Dragi Goste,
da, radi upravo tako kako si rekao.
Ma nije to moje, resio sam problem. (Zakrpio ono sto vec postoji ;))

Na slican nacin ovom tvom predlozenom sam resio rejting kad sam radio neku svoju skripticu, ALI, tada klijentu nije trebao ip (provera glasanja).

Pozdrav!


Ma nisam ja gost, to sam ja... coleee :)

(jbg, skoro gledah malu nocnu muziku)

[ kelja @ 25.03.2010. 22:16 ] @
He, he, :)
Nego da zanemarimo malo rejting...

Kako bi ti uopste resio taj problem onemogucavanja ponovnog glasanja (bez logina; dakle nema registrovanja korisnika)? Pre 3-4 godine sam pitao ovde na forumu, bas kad sam radio taj pomenuti sajt, i nismo, koliko se secam, dosli do nekog valjanog zakljucka. :)

Odnosno, ovo sa ip je vrlo zgodno dok se sajt testira. Ako bi broj posetilaca/glasanja dostigao neke opasne visine, skript bi puk'o ko tikva. (Stotine i stotine hiljada redova koje treba proveriti ne bi verovatno drazesno uticale na performanse)

:)
[ mitke013 @ 25.03.2010. 22:44 ] @
Citat:
kelja: He, he, :)
Nego da zanemarimo malo rejting...

Kako bi ti uopste resio taj problem onemogucavanja ponovnog glasanja (bez logina; dakle nema registrovanja korisnika)? Pre 3-4 godine sam pitao ovde na forumu, bas kad sam radio taj pomenuti sajt, i nismo, koliko se secam, dosli do nekog valjanog zakljucka. :)

Odnosno, ovo sa ip je vrlo zgodno dok se sajt testira. Ako bi broj posetilaca/glasanja dostigao neke opasne visine, skript bi puk'o ko tikva. (Stotine i stotine hiljada redova koje treba proveriti ne bi verovatno drazesno uticale na performanse)

:)


Ja sam to resio preko $_COOKIES koji traju 24 h ovim kodom:
Code:

public function addRate($rate)
{
    $rating = $this->Rating ;
    $rating->rate += $rate ;
    $rating->voted += 1 ;
    $rating->percentage = round($rating->rate / $rating->voted / 5 * 100) ;
    $rating->save() ;
    setcookie(strtolower(get_class($this)) . '_' . $this->id , '1', time()+COOKIE_TIMEOUT, '/' );
}


Na ovaj nacin se moze glasati za SVAKI objekat, bez da mislis o imenu. Proveru da li je neko glasao uradis ovako:
Code:

public function isRated()
{
    return isset($_COOKIE[strtolower(get_class($this)) . '_' . $this->id]) ;
}


Posto ti preporucujem neki template sistem, onda u .tpl stavis nesto poput:
Code:

{if $example->isRated()}
  Vec si glasao
{else}
  <a href="vote.php?id={$example->id}&rate=1" >1</a>
  <a href="vote.php?id={$example->id}&rate=2" >2</a>
{/if}


$example je instanca objekta za koji hoces da se glasa. Ovo je samo grubi primer, MVC to cini mnogo laksim.

Oko IP-a se uopste ne bih zamarao; vecina ljudi ima dinamicke ip adrese pa ti to ne znaci mnogo.

Zastitu glasanja od botova moraces sam da smislis. Ne mogu ti bas sve otkriti :)
[ kelja @ 25.03.2010. 23:01 ] @
Pa hvala i na ovome. Sad jos samo da naucim osnove oop-a i savladam neki template sistem. :)