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
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
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
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
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
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
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
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
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
blaaablaaa:

Dobře to bych možná pochopil, ale nebyl by pro moji jistotu nějaký příklad ?
Oggymot
Profil
Dobrý, už jsem to vyřešil :)
Oggymot
Profil
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
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
Jop, děkuji už to funguje ! :)
Oggymot
Profil
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
Na 13. řádku explicitně požaduješ 1. td v řádku. Tedy to vyhledává jen v 1. sloupci.
Oggymot
Profil
Aha, už to funguje. Díky
Oggymot
Profil
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
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.
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
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
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.

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: