Autor | Zpráva | ||
---|---|---|---|
PewZomriKoláč Profil * |
#1 · Zasláno: 2. 4. 2015, 23:29:26
Zdravím, potreboval by som pomôcť s jednou vecou.
Ako zvýšim každú hodinu nejakú hodnotu o napríklad 10. Mám tabuľku kde je hodnota a a chcem aby sa každú hodinu (tj: 00:00, 01:00, 02:00...) zvýšila hodnota a o 10 takže o polnoci bude hodnota 0 potom 10, potom 20 a stále sa pripočítavať. |
||
Keeehi Profil |
#2 · Zasláno: 2. 4. 2015, 23:34:40
Možné to samozřejmě je. Je však vysoce pravdepodobné, že chceš vytvořit něco, co se standardně dělá jinak. K čemu by se měla ta hodnota z databáze používat? Co se snažíš vytvořit?
|
||
1Pupik1989 Profil |
#3 · Zasláno: 3. 4. 2015, 07:48:55
V databázi bych nic neaktualizoval. Do databáze si uložíš počáteční čas. Mysql pak má funkce jako TIMEDIFF nebo TIMESTAMPDIFF na výpočet rozdílů dvou časů.
|
||
Marschmallow Profil |
#4 · Zasláno: 3. 4. 2015, 07:59:34
PewZomriKoláč:
Další možností je použití PHP skriptu, který bude vždy pomocí UPDATE aktualizovat obsah o +10. Ten skript potom budeš pomocí Cronu spouštět každou hodinu. |
||
PewZomriKoláč Profil * |
#5 · Zasláno: 5. 4. 2015, 15:27:57
Ide o pripočítavanie surovín.
Urobil som to nejak takto, tabuľka: nick drevo kamen zlato admin 0 0 0 A v CRONe dal cestu ku skriptu: <?php include "config.php"; $drevo = mysql_query("UPDATE suroviny SET drevo='drevo+100' WHERE nick=$_SESSION['name']"); $kamen = mysql_query("UPDATE suroviny SET kamen='kamen+100' WHERE nick=$_SESSION['name']"); $zlato = mysql_query("UPDATE suroviny SET zlato='kamen+100' WHERE nick=$_SESSION['name']"); ?> No nechce to fungovať, neviete prečo? |
||
Keeehi Profil |
#6 · Zasláno: 5. 4. 2015, 15:35:55
PewZomriKoláč:
To bude tím, že $_SESSION nebude existovat. Je to přesně jak jsem si myslel. Cron v tomto případě není vůbec potřeba a proto na něj zapomeň. Ty reálně nepotřebuješ updatovat databázi každou hodinu, tobě stačí si uložit čas posledního updatu a až se uživatel příště přihlásí, zjistíš kolik hodin mezi tím uběhlo, tím vynásobíš ten základ a provedeš jeden update. Kromě toho, že místo x dotazů provedeš jen jeden to má výhodu i v tom, že $_SESSION bude existovat. |
||
PewZomriKoláč Profil * |
#7 · Zasláno: 5. 4. 2015, 15:40:03
Ako ale zistím čas posledného updatu a čas kedy sa prihlásil užívateľ?
|
||
Keeehi Profil |
#8 · Zasláno: 5. 4. 2015, 16:24:51
PewZomriKoláč:
Čas posledního updatu je ten čas, kdy se proáděl. Tedy když se bude provádět, uložíš si i aktuální čas. A k tomu přihlášení - ono ani tak nejde o to, kdy se přihlásil. Kontrolovat změnu (a případně provést update) chcš dělat při přechodu na každou stránku. Takže nepotřebuješ vědět kdy se přihlásil (i když i to je velmi lehké zjistit) ale zajímá tě aktuální čas. A v tom je celá ta krása. Vždy pracuješ s aktuálím časem a dopočítáváš jen rozdíly k časům které si v důležité okamžiky uložil. Jako třeba k poslednímu nákupu, protože to byla poslední událost při které se měnily penize. |
||
Alphard Profil |
„a až se uživatel příště přihlásí, zjistíš kolik hodin mezi tím uběhlo, tím vynásobíš ten základ a provedeš jeden update“
On ten update ani není potřeba, protože uložená hodnota stejně bude při příštím přístupu neaktuální a bude se to provádět celé znovu. Ukládal bych si aktuální hodnotu materiálu a čas ve chvíli, kdy se nějakým způsobem změní kapacita výrobních prostředků (vybuduje se nový lom) nebo dojde ke změně aktuálního stavu (něco se prodá). V databázi bude záznam (schématicky) materiál | počáteční stav | výrobní kapacita za hodinu | čas změny ----------------------------------------------------------------------------- kámen | 15648 | 1000 | 2015-04-05 17:22:20 Rutina, která zpřístupňuje stav kamene, načte tento záznam a provede výpočet kamen = počáteční stav + výrobní kapacita * (now() - čas změny) |
||
PewZomriKoláč Profil * |
#10 · Zasláno: 5. 4. 2015, 20:56:52
Takže mám tabuľku:
nick drevo kamen zlato last_update time added admin 1500 2000 2500 0 Stále ale nechápem ako dosadím tie časy do tabuľky a ako ich odčítam, bol by niekto taký dobrý a pomohol mi? Najlepšie nejakým príkladom. |
||
PewZomriKoláč Profil * |
#11 · Zasláno: 6. 4. 2015, 13:07:46
Už mám teda uložený čas posledného updatu aj aktuálny čas, no neviem ako ich od seba odčítam respektíve ako zistím ten čas medzi nimi.
|
||
Alphard Profil |
#12 · Zasláno: 6. 4. 2015, 13:48:42
Asi bych počítal rozdíl sekund stackoverflow.com/a/17114475 a tu výrobní kapacitu, kterou jsem původně uvažoval za hodinu, bych definoval za sekundu.
|
||
juriad Profil |
#13 · Zasláno: 6. 4. 2015, 14:06:24
Alphard:
Není lepší v tomto případě počítat s UNIXovým časem (v sekundách od 1.1.1970) než s DateTime? Je to jednodušší a řeší to i komplikace s letním/zimním časem. PewZomriKoláč: Jelikož se evidentně snažíš o nějakou hru se simulací surovin Je otázkou, jaké povahy jsou ty zdroje: 1) kontinuální - vyrábí pořád, řekněme 0.1 jednotky za sekundu - lze popsat frekvencí. 2) skokové - jednou za pár sekund/minut vyrobí jednu nebo víc surovin 3) jednorázové - po nějakém čase vyrobí určitý počet a skončí Pak také jde o dostupnost surovin: 1) suroviny jsou dostupné pořád, stačí je jen sbírat 2) suroviny je potřeba těžit, je jich nekonečně a těžba spotrebovává jine suroviny 3) surovin je konečně, je třeba je těžit a těžba spotřevává jiné suroviny Z těchto všech možností (a určitě lze vymyslet další) je nutné vybrat jen některé a ty podporovat. Pak jde jen o to vypočítat aktuální stav ve spojitém případě a odsimulovat všechny události (které je nutné umět vygenerovat z jakéhokoli stavu a časového okamžiku) do současnosti. Rozmysli si pořádně, co vlastně chceš (a budeš chtít). Připočítat 10 každou hodinu může být jen aktuální zadání (které je jednoduché - stačí násobit a zaokrouhlovat dolů). |
||
PewZomriKoláč Profil * |
#14 · Zasláno: 6. 4. 2015, 17:35:00
Mám tabuľku
resources kde mám položky id, gold, produkcia, cas .
Zostrojil som tento kód, no nechce fungovať neviete kde mám chybu? <h1>Vaše suroviny</h1> <?php $d1 = mysql_query("SELECT cas FROM resources"); $date1 = mysql_fetch_array($d1); $date2 = new DateTime(); $gold = $date1[0]->getTimestamp() - $date2->getTimestamp(); $prod = mysql_query("SELECT produkcia FROM resources"); $produkcia = mysql_fetch_array($prod); $pribudlo = $produkcia[0] * $gold; mysql_query("INSERT INTO resources(gold) VALUES('$pribudlo')"); $sql = mysql_query("SELECT gold FROM resources"); $zlato = mysql_fetch_array($sql); ?> Zlato <b><?php echo $zlato[0] ?></b> |
||
Tomáš123 Profil |
#15 · Zasláno: 6. 4. 2015, 18:08:06
PewZomriKoláč:
Na riadku 7 si vymenil pozíciu menšiteľa a menšenca rozdielu. Aktuálny čas je väčší ako čas uložený v databáze. Opačným rozdielom ti vyjde záporná hodnota... Čo konkrétne nefunguje? |
||
Alphard Profil |
#16 · Zasláno: 6. 4. 2015, 18:24:05
juriad:
„Není lepší v tomto případě počítat s UNIXovým časem (v sekundách od 1.1.1970) než s DateTime?“ Když už jsem to převedl na timestamp, tak to tak působí, že? Mohlo by se pracovat přímo s ním, ale já jsem kvůli konzistenci zvyklý všude používat Datetime. Db layery mi automaticky vracejí instance Datetime, přímo je používám v modifikačních příkazech, mohu používat typehinty, mám pro to celkově připravené komponenty. Protože mi tento přístup vyhovuje, preferuji ho i ve svých odpovědích. Navíc, má původní rada byla obecná, lze ji aplikovat i s timestampem. |
||
PewZomriKoláč Profil * |
#17 · Zasláno: 6. 4. 2015, 18:53:58 · Upravil/a: PewZomriKoláč
Hodnota gold v databáze sa nezvýši a tiež sa vyskytne error na stránke.
Problém by mal byť na riadku 7 hoci som aj vymenil menšiteľa a menšenca. |
||
Tomáš123 Profil |
PewZomriKoláč:
„Hodnota gold v databáze sa nezvýši“ Do databázy ukladáš iba hodnotu 'pribudlo' , 'gold' neaktualizuješ...
„a tiež sa vyskytne error na stránke“ Aké je jeho znenie? Čo je na chybnom riadku a niekoľkých riadkoch okolo? |
||
PewZomriKoláč Profil * |
#19 · Zasláno: 6. 4. 2015, 19:11:47
Som už fakt bezradný...
Môj terajší kód: $d1 = mysql_query("SELECT cas FROM resources"); $date1 = mysql_fetch_array($d1); $date2 = date('Y-m-d h:i:s a', time()); $gold = ($date2->getTimestamp()) - ($date1[0]->getTimestamp()); $prod = mysql_query("SELECT produkcia FROM resources"); $produkcia = mysql_fetch_array($prod); $pribudlo = $produkcia[0] * $gold; $sql = mysql_query("SELECT gold FROM resources"); $zlato = mysql_fetch_array($sql); mysql_query("UPDATE resources SET gold=$pribudlo WHERE id=1"); Zobrazovanie errorov nemám k dispozicí, no namiesto neho sa mi zobrazí "prázdna stránka" na jeho mieste. |
||
juriad Profil |
#20 · Zasláno: 6. 4. 2015, 19:34:11
PewZomriKoláč:
$date1 je pole. Jeho první prvek (s indexem 0) je řetězec, nikoli instance třídy DateTime. Tedy volání metody getTimestamp() neprojde.
|
||
Tomáš123 Profil |
#21 · Zasláno: 6. 4. 2015, 19:37:11
PewZomriKoláč:
Nasledujúce postrehy nemusia vôbec riešiť chybu: 1. Na riadku 4 používaš na čas formát, ktorý nemusí pasovať ku formátu z databázy 2. Ani v jednom prípade neprechádzaš vrátené hodnoty cyklom (ale ak je v tabuľke iba jedna hodnota (čo by mala keďže používaš UPDATE ), asi to nie je potrebné)
V PHP skripte používaš premennú gold na to, čo v databáze označuješ čas. Gold v databáze je zas premenná $pribudlo , pričom pribudlo neobsahuje hodnotu zlata. Skutočná hodnota zlata by mala byť $povodny_počet + $produkcia*$casovy_rozdiel . Ty sa v tom nepopletieš?
Používaj v PHP premenné s rovnakým názvom ako názvy stĺpcov v tabuľke. |
||
PewZomriKoláč Profil * |
#22 · Zasláno: 6. 4. 2015, 20:17:22
juriad, ako by mal teda správa vypadať ten riadok?
|
||
1Pupik1989 Profil |
Hlavně u online her se žádný cron atd. nepoužívají. Uloží se jen počáteční čas. Někdo na tebe zaútočí, tak čas nahradíš aktuálním a suroviny u budovy s uživatelovým id nastavíš na 0. Čili máš 3 tabulky. Jedna je info o hráčích, druhá jsou třeba budovy (pokud je máš) a třetí je fronta včetně typu akce (těžení suroviny, útok, ...). V dotazu pak jednoduše dopočítáš kolik měl surovin při útoku.
|
||
Časová prodleva: 10 let
|
0