Autor | Zpráva | ||
---|---|---|---|
Oggymot Profil |
Ahoj,
jsem začínající programátor přes PHP, HTML, CSS, JS a potřeboval bych poradit. Dělám takovou hru kde se má na pozadí odpočítávat čas a třeba každou hodinu přičíst do databáze ke každému uživateli X peněz. Jenže nevím jak zřídit ten časovač na pozadí, aby tam nemusel být nikdo přítomný. A nebo by úplně stačilo, že to po té hodině vždy s přístupní tlačítko, které se po kliknutí zase na hodinu znepřístupní. Děkuji předem všem co mi pomohou a snad to vyřeším :) |
||
juriad Profil |
Nebudeš mít časovač. Uložíš si do databáze, kdy uživatel provedl akci a jak dlouho má čekat. Následně prostě vypočítáš z aktuálního čásu, kolik času zbývá. A pokud zbývá méně než 0, zobrazíš tlačítko.
|
||
Oggymot Profil |
#3 · Zasláno: 2. 4. 2015, 11:25:01
Dobře a nějaký příklad by nebil ? Takže jsem pochopil, že do databáze uložím kdy provedl akci ve formátu 11:15 (třeba). A v 12:15 to nějakým scriptem odemknu ?
|
||
blaaablaaa Profil |
#4 · Zasláno: 2. 4. 2015, 11:48:41
Oggymot:
Ulozis si cas (datetime), kdy se mu ma zpristupnit tlacitko. Kdyz uzivatel nacte stranku, zjistis, jestli je aktualni cas vetsi nebo roven ulozenemu casu. Pokud ano, zpristupnis tlacitko. |
||
Oggymot Profil |
#5 · Zasláno: 2. 4. 2015, 12:20:54 · Upravil/a: Oggymot
blaaablaaa:
To by šlo, děkuji všem snad to nějak zprovozním :) No takže do databáze mi to už čas zapíše, ale když se snažím udělat to, že když je čas stejný nebo větší, tak to nejde... Definice času: $time = Date("H:i"); $cas = $time; $cas1 = date("H:i", mktime(date(H), date(i)+1)); Porovnání: if($_SESSION['datum'] < $cas ){ $text = 'Vybrat daně'; $_SESSION['vybrano'] = 0; } if($_SESSION['datum'] == $cas ){ $text = 'Vybrat daně'; $_SESSION['vybrano'] = 0; } |
||
petr 6 Profil |
#6 · Zasláno: 2. 4. 2015, 17:01:41
Oggymot:
„Definice času“ Druhy radek je zbytecny. Treti radek je nesmysl. Takto to dava smysl: $cas = date("H:i"); $cas1 = date("H:i", strtotime('+1 hour')); „Porovnání“ Opet zbytecne dve vetve, ktere delaji to same. Staci jedna: if($_SESSION['datum'] <= $cas ){ $text = 'Vybrat daně'; $_SESSION['vybrano'] = 0; } Otazkou ovsem je, co mas v session, a kazdopadne je lepsi porovnavat cisla nez retezce, tj. misto "H:i" generovat cas ve formatu "Hi" nebo jeste lepe "Gi" (pripadne "U" - zalezi, co presne ma tvoje aplikace delat) |
||
Keeehi Profil |
#7 · Zasláno: 2. 4. 2015, 17:19:05
Nerad bych se mýlil ale zdá se mi, že když procesu akci v 23:59, tak se mi ti nikdy neodemkne jelikož další den začíná v 00:00 což je však menší a to že se jedná o další den už tam nijak zohledněno není.
Jinak pozor na sessions, není to bezpečné úložiště (z hlediska permanentnosti dat). |
||
Tomáš123 Profil |
#8 · Zasláno: 2. 4. 2015, 17:56:25
Oggymot:
Neviem, o čo presne ti ide, ale nasledujúca štruktúra by ti mohla pomôcť: <?php //ak je užívateľ nový, alebo uplynul požadovaný čas if(empty($_SESSION['last_click']) or time() - $_SESSION['last_click'] > 3600) { ... } //v opačnom prípade (ak chceš niečo užívateľovi zobraziť iba v prípade, ak ubehol čas, tento blok vôbec nemusíš v kóde napísať) else { ... } ?> |
||
Oggymot Profil |
#9 · Zasláno: 2. 4. 2015, 22:53:01
Vím že to dělám moc složitě, ale nejsem moc pokročilý. Ale teď jsem udělal vše podle rad a stejně to moc nefunguje :(
A taky jsem otravný. Pořád nevím kde je ta chyba, ale ty peníze to odečte nastaví to u vybrano 1, ale nezablokuje tlačítko.. $vyb = Db::querySingle(' SELECT vybrano FROM uzivatele WHERE uzivatele_id=? ', $_SESSION['uzivatel_id']); if($vyb == '1'){ $text = 'Nelze vybrat daně'; $textik ='Disabled'; } $cas = Date("H:i"); $cas1 = date("H:i", strtotime('+1 hour')); $dane = Db::querySingle(' SELECT dane FROM uzivatele WHERE uzivatele_id=? ', $_SESSION['uzivatel_id']); $obyv = Db::querySingle(' SELECT obyvatel FROM uzivatele WHERE uzivatele_id=? ', $_SESSION['uzivatel_id']); $peniz = $obyv * $dane; $odce = Db::querySingle(' SELECT penize FROM uzivatele WHERE uzivatele_id=? ', $_SESSION['uzivatel_id']); $penize = $odce + $peniz; $stav = '1'; if ($_POST) { { Db::query(' UPDATE uzivatele SET penize=?, datum=?, vybrano=? WHERE uzivatele_id=? ', $penize, $cas1, $stav, $_SESSION['uzivatel_id']); $zpravas = '<div class="isa_success"><i class="fa fa-check"></i>Vybral jsi: ' . $peniz . ' Kč ! </div>'; header('Refresh: 1; url=index_l.php'); } } if($_SESSION['datum'] <= $cas ){ $text = 'Vybrat daně'; $textik =''; $vyb = 0; } Doufám, že mi pomůžete a já se moc omlouvám, že takhle otravuju :) Opravdu moc děkuji všem co se zapojili. |
||
blaaablaaa Profil |
#10 · Zasláno: 3. 4. 2015, 12:46:42
Oggymot:
1. nepouzivej Db::querySingle, ale vyber vse v jednom dotazu 2. datum nastav datetime a pouzivej pak format Y-m-d H:i:s 3. na session se v tomhle pripade vykasli ale pouzij neco jako SELECT * FROM uzivatele WHERE datum<=NOW() AND uzivatele_id=?
|
||
Oggymot Profil |
#11 · Zasláno: 4. 4. 2015, 13:02:08
blaaablaaa:
Dobře to bych možná pochopil, ale nebyl by pro moji jistotu nějaký příklad ? |
||
Oggymot Profil |
#12 · Zasláno: 4. 4. 2015, 14:02:39
Dobrý, už jsem to vyřešil :)
|
||
Oggymot Profil |
#13 · Zasláno: 5. 4. 2015, 14:53:49
No, ale ukázal se tu další problém a to ten co se tu už objevil...
Keeehi: Nerad bych se mýlil ale zdá se mi, že když procesu akci v 23:59, tak se mi ti nikdy neodemkne jelikož další den začíná v 00:00 což je však menší a to že se jedná o další den už tam nijak zohledněno není. Nevíte někdo jak tento problém vyrešit ? Předem děkuji za odpovědi. |
||
Alphard Profil |
#14 · Zasláno: 5. 4. 2015, 15:23:26
Já jsem k tomu měl napsaný komentář už u Odečítání času, ale pak jsem ho neodeslal. Řešení je jednoduché, neuvažovat pouze čas, ale kompletní datum.
|
||
Oggymot Profil |
#15 · Zasláno: 5. 4. 2015, 15:54:26
Jop, děkuji už to funguje ! :)
|
||
Oggymot Profil |
#16 · Zasláno: 6. 4. 2015, 12:40:57
Tak, už mám zase další dotaz.
Mám tabulku se seznamem uživatelů, ale když je dlouhá, tak je potřeba vyhledávání to by šlo. Jenže když vyhledávám, tak uživatele to ignoruje a bere to jen nadpisy... nevíte někdo ? <center><form action="#" method="get" onsubmit="return false;"> <input type="text" size="30" name="q" id="q" value="" onkeyup="doSearch();" /> </form></center> <script type="text/javascript"> //<!-- function doSearch() { var q = document.getElementById("q"); var v = q.value.toLowerCase(); var rows = document.getElementsByTagName("tr"); var on = 0; for ( var i = 0; i < rows.length; i++ ) { var fullname = rows[i].getElementsByTagName("td"); fullname = fullname[0].innerHTML.toLowerCase(); if ( fullname ) { if ( v.length == 0 || (v.length < 3 && fullname.indexOf(v) == 0) || (v.length >= 3 && fullname.indexOf(v) > -1 ) ) { rows[i].style.display = ""; on++; } else { rows[i].style.display = "none"; } } } var n = document.getElementById("noresults"); if ( on == 0 && n ) { n.style.display = ""; document.getElementById("qt").innerHTML = q.value; } else { n.style.display = "none"; } } //--> </script> <center><table border="1" id="table"><tr><td>Pořadí</td><td>Uživatel</td><td>Obyvatel</td><td>Stát</td><td>Finance</td><td>Server</td></tr><?php foreach ($clanky as $clanek) { $i++; echo('<tr><td> ' . $i . '</td><td><a href="uzivatel.php?id=' . htmlspecialchars($clanek['jmeno']) . '">' . htmlspecialchars($clanek['jmeno']) . '</a></td><td> ' . htmlspecialchars($clanek['obyvatel']) . ' </td><td> ' . htmlspecialchars($clanek['jmeno_statu']) . ' </td><td> ' . htmlspecialchars($clanek['penize']) . ' Kč</td><td> ' . htmlspecialchars($clanek['loc']) . '</td></tr>'); } ?> <tr style="display:none;" id="noresults"> <td>(Nin nenalezeno na "<span id="qt"></span>")</td> </tr> </table></center> Předem děkuji za odpověď. |
||
juriad Profil |
#17 · Zasláno: 6. 4. 2015, 12:46:37
Na 13. řádku explicitně požaduješ 1. td v řádku. Tedy to vyhledává jen v 1. sloupci.
|
||
Oggymot Profil |
#18 · Zasláno: 6. 4. 2015, 16:28:36
Aha, už to funguje. Díky
|
||
Oggymot Profil |
#19 · Zasláno: 8. 4. 2015, 18:41:15
Takže, mám tu další problém..
Na stránkách mám formulář: <form method="post"> <input type="number" value="<?= htmlspecialchars($uzivatel['dane']) ?>" name="dane" min="0" max="30" step="5"/> <input type="submit" value="Nastavit" /> </form> Jenže jak mám to maximum čísla, tak kámoš zjístil, že na mobilu mu to jde překonat.. Nevíte někdo jak to zablokovat na všechny druhy zařízení ? Předem děkuji za odpověď. |
||
juriad Profil |
#20 · Zasláno: 8. 4. 2015, 18:53:32
Oggymot:
Nespoléhej na to zákazy v HTML, některé prohlížeče dokonce neznají ani type="number", takže se jim zobrazí stejně jako type="text". Ochranu v HTML (a v JS) půjde vždy obejít. Vždy musíš kontrolovat vstup na straně serveru. |
||
Časová prodleva: 14 dní
|
|||
Oggymot Profil |
Mám problém.. Ty daně fungovaly, ale najednou to do databáze nechce to datum zapisovat.. Nevíte někdo proč ?
$cas = Date("Y-d-m H:i"); $cas1 = Date("Y-d-m H:i", strtotime('+1 Hour')); $time = $cas; if($_POST) { If($obyv >= $jidlo){ Db::query(' UPDATE uzivatele SET penize=?, datum=?, vybrano=?, stav=?, obyvatel=? WHERE uzivatele_id=? ', $penize, $_POST['cas'], $stav, $stav, $obyva, $uzivatel['uzivatele_id']); header('Location: index_l.php?danea'); } else { Db::query(' UPDATE uzivatele SET penize=?, datum=?, vybrano=?, stav=? WHERE uzivatele_id=? ', $penize, $_POST['cas'], $stav, $stav, $uzivatel['uzivatele_id']); header('Location: index_l.php?dane'); } } <form method="POST"> <input type="hidden" name="cas" value="<?php if (isset($cas1)) echo($cas1); ?>" /> <input type="submit" value="<?php if (isset($text)) echo($text); ?>" <?php if (isset($textik)) echo($textik); ?>/> </form> A poslední datum co to zapsalo bylo 2015-10-04 15:52:00.. |
||
petr 6 Profil |
#22 · Zasláno: 23. 4. 2015, 09:54:07
Oggymot:
Která z těch dvou větví nezapisuje? V první větvi používáš napřed proměnnou $obyv a pak $obyva , může být problém v tom?
|
||
Oggymot Profil |
Nezapisuje to pouze datum. Nevím proč. Fungovalo to a teď to už nezapisuje. A to $ obyva je pouze na odečítání.
|
||
Oggymot Profil |
#24 · Zasláno: 25. 4. 2015, 11:22:37
Aha :) Už jsem to našel.. Chyba byla v definici, protože MySQL měla formát YYYY-MM-DD HH:mm a já jsem měl YYYY-DD-MM HH:mm. Ale je divné, že se to najdenou změnilo a formát je jiný. No nakonec už to funguje, tak jsem rád. A děkuji Všem co se mě snažili pomoci.
|
||
Časová prodleva: 10 let
|
0