Autor Zpráva
PewZomriKoláč
Profil *
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
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
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
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 *
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
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 *
Ako ale zistím čas posledného updatu a čas kedy sa prihlásil užívateľ?
Keeehi
Profil
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 *
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 *
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
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
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 *
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
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
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 *
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 *
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
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
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 *
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.

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