Autor Zpráva
perwin
Profil
Ahoj,
potřeboval bych poradit, jak v PHP vyrobit script, který by dokázal, aby se vždy do nějaké tabulky v celé hodiny přičítali nějaká čísla:
v 00:00 přičte do sloupce pricist cislo 20, v 01:00 přičte do sloupce pricist cislo 20,... 24:00 přičte do sloupce pricist cislo 20, a toto se opakuje neustále...
Děkuji za rady
Krakatoa
Profil
cron (nastaví spouštění php scriptu v daný čas a to i opakovaně) a php script
Keeehi
Profil
perwin:
Můžeš nám napsat, proč je to takto potřeba? Cron použít můžeš, ale dá se vymyslet třeba i lepší řešení.
perwin
Profil
Keeehi:
Vyrábím jednu webgame a hráči se každou hodinu přičítají suroviny... Stačí?
Keeehi
Profil
perwin:
Tak to se většinou dělá tak, že se počítá kolik má daný hráč surovin až v momentě, kdy je to potřeba. Tudíž si uložíš poslední stav suroviny a a příslušný čas, v kolik to bylo a když bude tu surovinu potřebovat (např za 3,5 hodiny) tak se podíváš do databáze, zjistíš rozdíl mezi uloženým časem a nynějším časem (3,5) a tím vynásobíš 20 a tím zjistíš přírůstek. Pokud tedy ve 12:00 má 100 surovin a bude chtít třeba v 15:30 zjistit, kolik surovin má, tak 100 + 3,5*20 = 170. Tento výsledek zase uložíš do databáze s aktuálním časem.
perwin
Profil
Keeehi:
No od toho jsem taky chtěl tu poslední aktivitu uživatele.

EDIT: Zjistil bych, kolik času ubylo od jeho poslední aktivity a vynásobil bych ho tou produkcí. -> tolik surovin by mu pribylo.
Keeehi
Profil
perwin:
Pak stačí tu aktivitu počítat přece při přechodu mezi stránkami. To že hejbe s myší je jedno, když se ta stránka neaktualizuje. Ta hodnota, kolik má těch surovin, zůstává stejná do té doby, než přejde na jinou stránku, nebo tu stránku obnoví. A to znamená nový požadavek na server a ten se dá spolehlivě odchytit.
perwin
Profil
Keeehi:
Díky moc :-) Už jsem to vyřešil.
perwin
Profil
Tady jsem si vyrobil kód, aby mi to při každém refreshi (přechodu na jinou stránku) zapsalo nový počet surovin:
<?php
session_start();
require('db.php');
if(isset($_POST['url'])) {
$url = $_POST['url'];
$ryby = $_POST['ryby']; // poslední počet ryby
$les = $_POST['les'];  // poslední počet dřeva
$obili = $_POST['obili']; // poslední počet obilí
$hlina = $_POST['hlina']; // poslední počet hlíny
$zelezo = $_POST['zelezo']; // poslední počet železa
$date = MySQL_Query("SELECT lastActivity, lastRyby, lastLes, lastObili, lastHlina, lastZelezo FROM `gameusers` WHERE nick='$_SESSION[login]'") or die (mysql_error());
$datum = mysql_fetch_array($date); // poslední počet surovin zapsaný v DB
$lastActivity = $datum['lastActivity']; // poslední aktivita uživatele
$now = date("Y-m-d H:i:s");  // čas nyní
$uplynuly_cas_s = strtotime($now)-strtotime($lastActivity); // kolik času uplynulo od poslední aktivity v sekundách
$uplynuly_cas_m = $uplynuly_cas/60; //totéž v minutách
$suroviny = MySQL_Query("SELECT ryby_sur, les_sur, obili_sur, hlina_sur, zelezo_sur, ryby_produkce, les_produkce, obili_produkce, hlina_produkce, zelezo_produkce FROM `gamevesnice` WHERE vlastnik='$_SESSION[login]'") or die (mysql_error());
$surky = mysql_fetch_array($suroviny); // znovu počet surovin (z jiné tabulky) a jejich produkce za hodinu
$srmin = $surky["ryby_produkce"]/60; /* produkce ryb za minutu */ $new_ryby = round($uplynuly_cas_m * $srmin + $ryby); // nový počet ryb: zaokrouhleno(kolik minut uplynulo KRÁT produkce ryb za minutu + bývalý počet ryb)
$slmin = $surky["les_produkce"]/60; /* produkce dřeva za minutu */ $new_les = round($uplynuly_cas_m * $slmin + $les); // -//-
$somin = $surky["obili_produkce"]/60; /* produkce obilí za minutu */ $new_obili = round($uplynuly_cas_m * $somin + $obili); // -//-
$shmin = $surky["hlina_produkce"]/60; /* produkce hlíny za minutu */ $new_hlina = round($uplynuly_cas_m * $shmin + $hlina); // -//-
$szmin = $surky["zelezo_produkce"]/60; /* produkce železa za minutu */ $new_zelezo = round($uplynuly_cas_m * $szmin + $zelezo); // -//-

mysql_query("UPDATE gameusers SET lastActivity=NOW(), lastRyby='$new_ryby', lastLes='$new_les', lastObili='$new_obili', lastHlina='$new_hlina', lastZelezo='$new_zelezo' WHERE nick='$_SESSION[login]'") or die (mysql_error());
 // zapsání posledních počtu surovin
mysql_query("UPDATE gamevesnice SET ryby_sur='$new_ryby', les_sur='$new_les', obili_sur='$new_obili', hlina_sur='$new_hlina', zelezo_sur='$new_zelezo' WHERE vlastnik='$_SESSION[login]'") or die (mysql_error());

header("Location: ".$url."&refresh=no"); // návrat na předchozí stránku
} else { header("Location: /index.php?page=uvod&Alert=5"); }
?>

Poraďte mi prosím, proč mi to nefunguje...
Děkuji
perwin
Profil
Myslím si, že ten CRON bude asi lepší... -> Jak lze nastavit PHP kód tak, aby u každého uživatele vybral poslední počet surovin, a sečetl ho s produkcí toho uživatele? Umím to udělat, když mám přesný název toho uživatele - mohu vybrat jeho poslední počet surovin, a k němu vybrat z druhé tabulky tu produkci.. ale jak to udělat, aby se to postupně provádělo u každého uživatele, když přece nemůžu zadat jména všech uživatelé dohromady?
Louka
Profil
Můžeš upřesnit, jak to nefunguje? Chybové hlášení nebo něco? Cron je na to opravdu zbytečný.
pcmanik
Profil
Louka
Cron nieje zbytocny, zamysli sa. Zautoci na neho niekto a bude mat malo surovin a pri tom ich mam mat uz 5 x tolko, takze je to hlupost a na toto treba pouzit cron. Samozrejme za predpokladu ze sa v tej hre bude utocit, co je velmi pravdepodobne.
Louka
Profil
pcmanik:
Myslím, že i při útoku lze spočítat, kolik surovin napadenému přibylo.
pcmanik
Profil
Louka:
To ano, ale je lepsie pouzit jeden dotaz popripade 2 kazdu hodinu, alebo neustale ich posielat na databazu? Povedzme ked bude naraz 100 ludi, tak to uz bude pre obycajny hosting celkom velka zataz.
Louka
Profil
1 nebo 2? Když bude registrováno 1000 hráčů, tak to ale bude 1 nebo 2 pro každého ne? A dotaz stejně budeš buset vykonat i při útoku, abys zjistil kolik těch surovin (připočítávaných cronem) je.

Takhle stačí jen při útoku zavolat dotaz a pak z něj dopočítat aktuální hodnoty...
pcmanik
Profil
Louka:
1, alebo 2 za hodinu, je rozdiel, ako ked sa budu neustale odosielat pri kazdom pohybe na webe, samozrejme neviem ci ide perwin-ovi o to aby mal tie suroviny presne, alebo pri kazdej hodine.

A pri utoku bude treba brat dalsie stlpce, v ktorych je hodinova produkcia, co je v celku zbytocne, ale potrebne pre dopocitanie tej aktualnej hodnoty.
Keeehi
Profil
Pokud by se měli suroviny připočítávat vždy přesně v xx:00 (v hodinových intervalech) tak by šel použít cron, pokud by se měly suroviny připočítávat průběžně (ne po hodinových dávkách) tak je potřeba to počítat až když je potřeba. Obzvlášť v případě, že se každému hráči během hodiny přidá jiný počet surovin.

pcmanik:
A pri utoku bude treba brat dalsie stlpce, v ktorych je hodinova produkcia, co je v celku zbytocne, ale potrebne pre dopocitanie tej aktualnej hodnoty.
To zase nějaké velké zdržení nebude. Navíc během dne ti přibude více surovin, než kolikrát na tebe zaútočí, takže ten dotaz při útočení se poměrem nebude vykonávat až tak často.

Ještě mě napadl jeden teoretický problém přidělování surovin v balících po hodinách. Vždy v celou bude na servru nával, jelikož všichni hráči budou čekat na příděl surovin. Při postupném doplňování surovin tento problém nehrozí.
perwin
Profil
Keeehi:
Zkusím to s tím CRONem, kdyby to dělalo problémy tak to předělám... Teď bych poprosil o radu, jak ten PHP kód pro CRON nastavit..
Vyrobil jsem tohle:
<?php
session_start();
require('db.php');
$sur = MySQL_Query("SELECT ryby_produkce, les_produkce, obili_produkce, hlina_produkce, zelezo_produkce FROM `gamevesnice` ORDER BY id_uzivatele") or die (mysql_error());
while($surs = mysql_fetch_array($sur)) { 
mysql_query("UPDATE gameusers SET lastRyby=lastRyby+'$surs[ryby_produkce]', lastLes=lastLes+'$surs[les_produkce]', lastObili=lastObili+'$surs[obili_produkce]', lastHlina=lastHlina+'$surs[hlina_produkce]', lastZelezo=lastZelezo+'$surs[zelezo_produkce]'") or die (mysql_error());
mysql_query("UPDATE gamevesnice SET ryby_sur=ryby_sur+'$surs[ryby_produkce]', les_sur=les_sur+'$surs[les_produkce], obili_sur=obili_sur+'$surs[obili_produkce], hlina_sur=hlina_sur+'$surs[hlina_produkce], zelezo_sur=zelezo_sur+'$surs[zelezo_produkce]'") or die (mysql_error());
}
?>
Jenže to mi nefunguje - nepříčítá to nikomu nic... poraďte mi prosím, proč...
A ktomu je tam ten problém, že kdyby někdo odhalil, že přidává suroviny tento soubor, tak by ho mohl pořád vyvolávat a tudíž pořád přidávat suroviny...
Děkuji
pcmanik
Profil
Nemas ukoncene niektore ' a ak ti to aj tak nepojde, tak si to skus spustit rovno na mysql servery, ci ti to bude vracat, to co cakas
A v tych UPDATOCH musis pridat WHERE id_vesnice = id_uzivatele, inak to nevie ze koho to ma zaktualizovat, resp to meni vsetkym uzivatelom.
V SELECTE teda musis tahat aj id uzivatela a dediny.
UPDATY mozes skombinovat do jedneho.

A skutocne potrebujes volat session_start() na zaciatku?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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