Autor Zpráva
Resigo
Profil *
Dobrý den, chtěl jsem se zeptat jak bych měl udělat z toho to kódu (popis: když kliknu na uživatele tak se mu přičtou body):
$query = mysql_query("UPDATE users SET points = points+1 WHERE username='$searchuser'");
takový kod, aby se provedl UPDATE, ale pouze jen když na uživatele klikne někdo nový. Vůbec si nevím rady, napadlo me jen že bych v mysql udelal sloupecek "prokliknuti" tam by se nastavovalo "0" nebo "1". Ale snad to jde i jednoduseji :) Všemo děkuji za radu :)
Tori
Profil
Přidala bych tabulku pro ta hodnocení (sloupce: ID hodnoceného, ID hodnotícího - a unikátní klíč přes oba dva dohromady). Unik.klíč se postará o to, aby každý uživatel mohl jiného hodnotit jen jednou, a počet bodů = počet odpovídajících řádků). To se mi zdá tak nějak nejjednodušší, a dá se to později přidáním sloupce rozšířit na hodnocení čehokoli jiného.
Resigo
Profil *
Tori:
Moc ti děkuju, prosím nemohla by si mi s tím pomoci, nebo mi aspon mohla vysvetlit co to je „unikátní klíč“ a jak ho použít :) (Promin jsem začátečník)
Tori
Profil
Resigo:
Unikátní klíč = hodnoty v tom sloupci (v tomto případě kombinace hodnot ve dvou sloupcích) se nesmí opakovat. Když pak vkládáte data, MySQL vyhodí chybu "duplicitní hodnoty" - podle toho zjistíte, že uživatel už toho druhého uživatele hodnotil. (Hodnocení sebe sama asi snáz zabráníte v PHP.) SQL příkaz na vytvoření indexu je přibližně
CREATE UNIQUE INDEX ON tabulka (ID_hodnoceného, ID_hodnotícího)
Když vytváříte tabulky v DB tak v každém programu je nějaká možnost, jak přidat indexy, zkuste pohledat.
Resigo
Profil *
Tori:
Moc děkuji!

Ted už se ptám jen tak na okraj: dá se z téhle tabulky posílat někam ty data (teda počet kolikrát na koho bylo kliknuto) ptám se proto abych mohl tabulku třeba každý týden resetovat? :)
Tori
Profil
Kam někam? Je to obyč.tabulka, co z ní načtete, to můžete poslat kde chcete. :)
Ale jestli to chcete jen kvůli něčemu jako "tento týden jsi dostal/a 123 hlasů", tak bych (místo průběžného promazávání) jen přidala sloupec s datumem, a pak vybírala počty řádků s omezením na max.týden staré, a seskupené podle hodnoceného uživ.
lukasik
Profil
Ted už se ptám jen tak na okraj: dá se z téhle tabulky posílat někam ty data (teda počet kolikrát na koho bylo kliknuto) ptám se proto abych mohl tabulku třeba každý týden resetovat? :)

Pokud myslíš vycucnout tak to jde jednoduchým kódem
"SELECT COUNT(*) FROM tabulka WHERE ID_hodnoceného = X"
kde x je číslo
Anonym
Profil *
lukasik:
Ano, něco takového jsem myslel, ale předtím jsem neuvedl kam to chci přesunout a to do jiné tabulky. Proto jsem se chtěl zeptat jestli to mám dělat tak, že si to vypíšu do jedne proměnné a tu insertem vložím do te druhe tabulky. Nebo jestli do jde nějak jinak? Nejlepe jedním příkazem.

Tori:
Přesný popis: Jde mi o to, že když hráč klikne na uživatele (ten co už na něj jednou kliknul) třeba za týden tak se tomu uživateli přidají zase body, ale ne dřív než když na něj klikne za ten týden :)
Anonym
Profil *
Dobrý den, tak jsem to nějak zprovoznil, kouknuli byste se mi na ten kód jestli je správně prosím :)
$queryrank = mysql_query("INSERT INTO ranking VALUES ('$searchid', '$id')"); //dám do tabulky ranking, tam je ten unik. klíč

<?php if(isset($searchid)){
                                                                      $hodnoceni = mysql_query("SELECT ID FROM ranking WHERE id = $searchid ");
                                                                      $data = mysql_num_rows($hodnoceni);
                                                                      echo ($data);
                                                                      }
                                                                      $insert =  mysql_query("UPDATE users SET points='$data' WHERE username='$searchuser'"); //vložím do tabulky ze které vypisuji body
                                                                      ?>
Tori
Profil
Anonym:
Aha, myslela jsem to tak, že by ta nová tabulka úplně nahradila sloupec users.points. Počet bodů, které uživatel dostal, byste zjišťoval spojením tabulek:
SELECT u.*, COUNT(*) 'points' FROM users u 
  LEFT JOIN ranking r ON u.id = r.id_hodnoceneho_uzivatele


tak se tomu uživateli přidají zase body, ale ne dřív než když na něj klikne za ten týden
K tomu mě napadl tento postup: Přidat tabulce ranking ještě 2 sloupce:
1. datum (DATE) - kdy byl uživatel1 tímto uživatelem2 naposled hodnocený
2. body (INT) - kolik bodů už od tohoto uživatele2 dostal.
Vložení záznamu by pak vypadalo asi takhle:
// zkusíme vložit nové hodnocení
$ins = mysql_query("INSERT INTO ranking (hodnoceny, hodnotici, datum) VALUES ($id1, $id2, CURDATE())");
if (!$ins && mysql_errno() == 1062) {
  // duplicita - uživatel1 už byl uživatelem2 hodnocen. Zkusíme přidat další hlas
  $update = mysql_query("UPDATE ranking SET body=body+1 WHERE hodnoceny = $id1 AND hodnotici = $id2 
    AND ADDDATE(datum, 7) > CURDATE() LIMIT 1");
  if (mysql_affected_rows() == 0) {
    // chyba - ještě neuplynul týden
  }
}

Nicméně to ukládání počtu bodů i k uživatelům (=při každém přidání hlasu zároveň updatovat tab. users) není špatný nápad - pokud byste měl hodně uživatelů a v ranking by bylo hodně řádků (nevím přesně odhadnout, určitě aspoň 10-tisíce), tak by se tím urychlilo čtení z DB.
Anonym
Profil *
Tori:
Moc ti děkuju, nějak to zkusím to tam dát :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0