Autor Zpráva
Babemeta
Profil
Zdravím,
potřeboval bych radu jak vyřešit spuštění aplikace po určité době. Jedná se o tento konkrétní příklad:
Hráč ve webové hře klikne na pracovat na 8 hodin. Spustí se odpočítávání 8 hodin a když se dostane na 0 tak se mu přičte XXX zlaťáků...Jedná se mi o to jak spustit nějaký php příkaz po uplynutí určité doby. Díky.
Keeehi
Profil
Babemeta:
1. možnost (fujmožnost) - spouštět cronem script na kontrolu, zda už těch 8 hodin uběhlo.
2. možnost - je to na naprogramování mnohem těžší, ale za to je prostě lepší. - Těch XXX zlaťáků se nepřičte hned, ale až to bude potřeba. Vytvoříš si nějakou tabulku "čekající", v té budeš ukládat uživatele, akci, která se má vykonat a čas, kdy se má vykonat. Když pak bude někdy potřeba zjistit, kolik má daný uživatel zlaťáků (výpis ve statistice, nějaký útok na něj, atd.), podívá se script do tabulky a zjistí, jestli se u daného uživatele nenalézá nějaká akce, která je už potřeba vykonat (čas vykonání je starší než aktuální) - tak tu akci vykonáš (např. přičteš 200 zlaťáků) a ten daný řádek z tabulky smažeš. A potom teprv provedeš výpis ve statistice, nějaký útok na něj, atd.
Babemeta
Profil
Jasně takže vlastně se to neřpříčte za 8 hodin, ale až když se tam někdo podívá tak se to zkontroluje. Díky. Zkusim to. Kdyžtak se ještě budu ptát :-D
Babemeta
Profil
Ještě jeden dotaz:
Co se týče toho ukládání příkazu, který se má vykonat do databáze jak to tam mám uložit? Ještě nejsem moc zběhlý v php a s tímhle jsem se nesetkal. Můžu tam uložit přímo kód, který se po vyvolání načte do php a přepíše ty údaje v jiné tabulce? Nebo jinak: jde uložit do databáze přímo PHP skript?
Babemeta
Profil
Teď jsem to zkoušel...ale hodí mi to unexpected tag takže pokud to tedy jde tak tam musí být nějaký speciální znamínka...bohužel si nevím rady :-(
Keeehi
Profil
Opět jsou minimálně 2 možnosti
1) ukládání PHP kódu do DB (fujmožnost) - „jde uložit do databáze přímo PHP skript“ Ano, normálně ho tam uložíš. Pro jeho provedení, ho potom z databáze načteš a provedeš funkcí
eval();
2) ta akce v DB není vlastně 1 sloupeček, ale 2. První udává typ akce a ten druhý hodnotu
//DB
typ|hodnota|..další sloupce
2  |+200
1  |-10

//php
switch ($typ) {
  case 1: $dotaz "UPDATE penize SET pocet_penez=pocetpeněz$hodnota WHERE hrac=$id_hrace"; break;
  case 2: $dotaz "UPDATE suroviny SET drevo=drevo$hodnota WHERE hrac=$id_hrace"; break;
}
mysql_query($dotaz);
Podle typu akce se switchem vybere dotaz, který se doplní hodnotou. Je to napsané jen rámcově, není to určené k bezhlavému kopírování, ale ta myšlenka v tom snad vidět je (dřevo se o 200 zvětší a peníze o 10 zmenší).
happyy
Profil *
Babemeta:
zadne php scripty se do db neukladaji.

pro zjednoduse to lze treba takto:

udelas si v tabulce sloupecek "pracujici", "zacatek", "doba_prace"

kdyz hrac zacne pracovat ulozis si do databaze do sloupce pracujici "ano", jako zacatek ulozis cas kdy zacal pracovat a do doba_prace cas jak dlouho bude pracovat.

pak pokazde kdyz bude hrac vstupovat na urcitou stranku tak zkontrolujes jestli je pracujici (pracujici = ano) a pokud je pracujici tak si odectem zjistis kolik mu zbyva do konce - pokud zjistis ze mu zbyva zaporny cas takto znamena ze uz ma odpracovane. nastavis pracujici na "ne" a prictes mu penize dle odpracovanych hodin.
Keeehi
Profil
happyy:
Tvoje 3 sloupečky zvládnu zkrátit do jednoho (samozřejmě tam jsou kolem ještě jiné, ale ty tam nemáš, tak je tak neuvádím) ->
- Začátek+doba práce=konec práce -> 1)ze dvou sloupečků je 1, 2) Součet se vykoná jen jednou a pak už se porovnává jen s výsledkem, v tvém návrhu se musí vždy ten součet provést při každém dotazu (zbytečná operace)
- Sloupec pracující se dá úplně vynechat. Pokud pracuj, tak záznam v tabulce je, pokud nepracuje, záznam tam není ;-)
happyy
Profil *
Keeehi:
Tvoje 3 sloupečky zvládnu zkrátit do jednoho
ne nezvladnes je dat do jednoho protoze potrebujes minimalne dva udaje - prvni kdy jsi zacal nebo kdy mas skoncit praci a druhy jak dlouho prace trvala (to podle konce prace to neurcis).

cele jsem to uvedl pro jednoduchost. samozrejme to pak muzeme resit na urovni databaze (triggery) a php uplne vynechat. ale myslim ze Babemeta slo predevsim o pochopeni jak na to.
Keeehi
Profil
happyy:
Ale já nepotřebuji vědět, jak dlouho práce trvala, takže mi stačí vědět konec. Nebo jsem snad zapomněl na něco, k čemu je potřeba vědět dobu práce? Pokud chce po x hodinách přidat y něčeho, tak dobu práce znát nepotřebuji.
Babemeta
Profil
Keehi: Jedinej problém je abych věděl kolik peněz přidat (např. když pracující dostane 20 za hodinu), ale to se dá vyřešit tak, že na začátku, když uživatel zadá na kolik hodin bude pracovat tak to kolik má dostat vynásobim přímo v php (20x8) a to pak zapíšu do databáze...A pak čas práce nepotřebuju vědět.
Babemeta
Profil
Ještě jsem se chtěl zeptat jak je to se zadáváním času do MySQL? INT my asi fungovat nebude co? A Datetime má prý zapisování odlišné od php. Mohl by mi to někdo prosím ukázat jak to tedy v mém případě zapsat? Díky moc
Luky
Profil
Já myslím, že datetime je běžný typ deklerace proměné pro datum. Výpis datumu pak může vypadat takto:
$datum = date(("d.m.Y H:i:s"),strtotime($databaze_datum));

zápis se dá provést jednoduše přes příkaz NOW ()
 $sql= mysql_query("INSERT INTO uzivatele (id, jmeno, prijmeni, datum) VALUES ('','$name','$surname',' NOW() )") or die(mysql_error()); 
 

v PHP kódu (když budeš zapisovat data do databáze)
happyy
Profil *
Babemeta:
rozhodne u databaze vyuzivej date a datetime sloupce. zadne int.
kdyz budes delat vypisy tak tohle poresis jiz v sql dotazu a pomoci date_format si nastavis jaky chces tvar casu a data.

pro ukladani vetsinou pouzijes NOW() jak vidis u toho co ti napsal Luky. nebo si ktomu neco pridas - NOW() + INTERVAL 8 HOUR by to ulozilo cas o 8 hodin vetsi nez je ted. a pokud bues potrebovat resit neco na urovni php ver ze to neni zadny problem. (doporucuju hosting s php 5.3 protoze se v od teto verze s daty pracuje casto jeste jednoduseji)
Babemeta
Profil
Díky moc.

Takže teď zkoušim udělat funkci, která po každym souboji zapíše do databáze akci 1 s aktuálnim časem + 1 hodina a jménem uživatele. A před každym soubojem se to zkontroluje a odečte öd aktuálního času. Pokud to ještě nebude hodina tak die.

ten zápis jsem udělal takhle:
$zapis=MySQL_query("INSERT INTO Akce(Postava,Cas,Typ) VALUES('$jmeno','NOW() + INTERVAL 1 HOUR','1')");


Tu podmínku jsem napsal takhle:
$dotaz5 = MySQL_Query("SELECT * FROM Akce WHERE Postava='$postava' && Typ='1'");

while ($zaznam5 = MySQL_Fetch_Array($dotaz5)){ 
$Databaze_cas=$zaznam5["Cas"];
}
$cas = date(("d.m.Y H:i:s"),strtotime($Databaze_cas));
$odecteni_cas = $cas - date("d.m.Y H:i:s");

if ($odecteni_cas > 0)
die('Musíte ještě počkat $odecteni_cas než budete moci znovu bojovat!');



Ale bohužel mi to nefunguje. Ani nevypisuje žádnej error: Odkaz (přihlásit -> Vyzvat na souboj)
Pochopil jsem vůbec ten princip dobře? Díky
Keeehi
Profil
Nějak takto:
$dotaz5 = MySQL_Query("SELECT Cas FROM Akce WHERE Postava='$postava' and Typ='1' and Cas>NOW();");

if(mysql_num_rows($dotaz5)==0){
   // může se bojovat
}
else{
  $zaznam5 = MySQL_Fetch_Array($dotaz5)
  die("Musíte ještě počkat do $zaznam5[Cas] než budete moci znovu bojovat!");
}
Bohužel nevím, jakého datového typu jsou sloupce v databázi. (Např. Typ by měl výt INT, pak se v dotazu nemusí obalovat apostrofy)

ještě by bylo dobré po tomto kódu provést
MySQL_Query("DELETE FROM Akce WHERE Postava='$postava' and Typ='1' and Cas<NOW();");
Jelikož by měl být v tabulce maximálně 1 záznam se stejnou postavou i typem, dalo by se v části může se bojovat provést
MySQL_Query("DELETE FROM Akce WHERE Postava='$postava' and Typ='1'");
Babemeta
Profil
Díky moc. Hned to vyzkoušim :-)
Babemeta
Profil
No tak nastal problém:

Využil jsem tvůj zápis takhle:

Kontrola:
$dotaz5 = MySQL_Query("SELECT Cas FROM Akce WHERE Postava='$postava' and Typ=1 and Cas>NOW();");

if(mysql_num_rows($dotaz5)==0){
MySQL_Query("DELETE FROM Akce WHERE Postava='$postava' and Typ=1");
}
else{
$zaznam5 = MySQL_Fetch_Array($dotaz5);
  die("Musíte ještě počkat do $zaznam5[Cas] než budete moci znovu bojovat!");}
$dotaz = MySQL_Query("SELECT * FROM Souboj WHERE Postava='$postava'");


Zápis
$zapis=MySQL_query("INSERT INTO Akce(Postava,Cas,Typ) VALUES('$postava','SELECT NOW() + INTERVAL 12000 SECONDS','1')");
if (!$zapis)
die ('Nepodařilo se zapsat Vaše údaje do databáze MySQL.');    


Zkoušel jsem zápis i bez SELECT. Vždy je problém v tom, že se do databáze zapíše čas 0:00 atd. Prostě samé nuly. Ten se pak smaže a zapíše znovu při každém spuštění skriptu. Prosím netušíte kde by mohla být chyba?

Díky
Keeehi
Profil
$zapis=MySQL_query("INSERT INTO Akce(Postava,Cas,Typ) VALUES('$postava',NOW() + INTERVAL 12000 SECOND,'1')");
takto by to mělo fungovat
happyy
Profil *
Babemeta, Keeehi
SECONDS pokud vim nic neni vzdy se to pise v jednotnem ciste - SECOND
Babemeta
Profil
Díky moc. Definitivně funguje :-)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0