Autor Zpráva
Welton123
Profil
Zdravím, dělám webový, soutěžní web, kde si uživatel bude schánět hlasy ke svému mazlíčkovi. V tabulce se automaticky řadí podle toho, kdo má nejvíce hlasů. Problém je vtom, že po měsíci mažu veškeré hlasy, aby měli šanci i nový uživatelé. Nějak ale nevím, jak udělat, aby zůstalo stejné pořadí soutěžících i po smazání hlasů. Máte nějaký návrh jak toho docílit?

Předem děkuji za každé rady.
Enko
Profil *
Pokud hlasy ukládáš do databázové tabulky, přidej si do konkrétní tabulky s hlasováním další sloupec, který bude určovat pořadí.
Tori
Profil
Welton123:
A co kdyby se každý den odmazávaly jen hodnocení starší než 1 měsíc? Pokud by nové fotky dostávaly hlasy často a staré už jen občas, tak se ty nové postupně dostanou nahoru samy. Jinak by mě totiž zajímalo, kdy a podle jaké logiky byste zase přepnul z pořadí "staré fotky z minulých měsíců" na pořadí "staré i nové fotky z tohoto měsíce", resp. jak byste v době těsně po smazání hlasů seřadil tyto fotky:
Kikina - minulý měsíc první s pěti hlasy, tento měsíc nehodnocena,
kočka Myš - minulý měsíc poslední se třemi hlasy, tento měsíc dva hlasy,
Béďa - nový, tento měsíc čtyři hlasy

Anebo možná by se dalo dopočítávat váhu jednotlivých hlasů, že jeden hlas před měsícem je třeba 25% jednoho hlasu z dneška.
Welton123
Profil
Takže to myslíš tak, abych nechal všechny hlasy v DB a na konci třeba měsíce září bych nastavil, aby se vypisovali pouze Ty, které jsou v měsíci říjnu a takto vždy v tom měsíci jen posunul datum? :)

Pokud ano, jak při výběru nastavit, aby to bralo jen hlasy za posledních 30 dnů? :/
Tori
Profil
Welton123:
U každého hlasu by mělo být uloženo, kdy byl přidán, tj. sloupec typu date nebo datetime (podle toho, jestli chcete ukládat i čas). Vlastně byste teda nemusel hodnocení promazávat, ale stačilo by pokaždé pracovat jen s hlasy za posledních 30 dní. Výběr řádků jen za poslední měsíc pak bude vypadat např.
$hranice = date('Y-m-d', strtotime('today - 30 days')); // vytvoří "2013-07-16"
$sql = "select * from tabulka
where datumPridani > '$hranice'";
anebo alternativně to můžete napsat i v SQL:

$sql = "select * from tabulka
where datumPridani > date_sub(now(), interval 30 day)";
První způsob je ale z hlediska MySQL lepší.
Welton123
Profil
Zapisuji do jedné tabulky ip adresu uživatele a pokud na web příjde až za 24 hodin, tak se jeho jeho ip smaže a může hlasovat znova.
Problém je, že hlasy přičítám ke každé fotce $hlasy+1, takže čas apod.. neukládám :/
Kajman
Profil
Welton123:

Tak z té tabulky se záznamem ip nemažte. V selectu, kterým se do ní díváte, zda tam ip je, tak přidejte podmínku, že hledáte záznam mladší 24 hodin.

Hlasy si klidně dál počítejte +1, ale jednou denně si přepočítejte počet hlasů podle té logovací tabulky, s omezením na záznamy z posledních 30 dnů (tohle je možné korektně udělat, až tam budemete mít záznamy těch 30 dní zpátky).

Jsou to malé změny současného mechanizmu. Jinak, aby se skutečně zachovalo pořadí, třeba by šlo neukládat hlasy jako celá čísla, ale hlasováním přidávat hodnoty s plovoucí čárkou, kdy každý den bude mít větší váhu než den předešlý.

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: