Autor Zpráva
grossik
Profil
Ahoj, potřeboval bych aktualizovat každou sekundu hodnotu, která je v databázi, takže když tu hodnotu v databázi změním tak ať se okamžitě přepíše a nebudu muset obnovovat stránku. Vím, že by to mohlo jít přes ajax, ale s ajaxem neumím. Poradíte mi někdo?
Kcko
Profil
Javascript: funkce SetInterval / SetTimeout, AJAX.
Pokud neumíš tak se nauč, všude toho je dost, pokud nechceš tak si to zaplať, pokud potřebuješ poradit s kódem tak ho sem vlož.

A IMHO to co chceš provádět je blbost.
grossik
Profil
Kcko:
Prostě nějak potřebuju udělat aby se vždy potom, co se změní data v tabulce se to aktualizovalo.
Kcko
Profil
grossik:
Na to stačí F5 ne? Nebo na to někdo kouká a neumí / nemůže si obnovit stránku?
grossik
Profil
Kcko:
Tam jde o to že se něco splní a jak se to splní tak se aktualizují ty data v tabulce a stránka se obnoví, jenže jí musím obnovit znova aby se to ukázalo obnovené, moc nechápu proč se jedna tabulka ukáže v pohodě, ale ta druhá musí čekat na další obnovení. Je to trochu složité a nevím jak to dobře vysvětlit, omlouvám se.
Kcko
Profil
grossik:
Ukaž, kde se to co popiješ nachází, moc moudrý z toho nejsem.
grossik
Profil
imgur.com/9Ajlv9I
imgur.com/RFrrEjA

Jak se dokončí to percentage_hlidka tak se stránka obnoví, tím pádem se dokončí i ten php kod nad tím (na tom obrázku úplně nahoře) a co se týče té úrovně tak se aktualizuje v pohodě (předpokládám, že kvůli tomu že je to pod tím až). Co se týče toho druhého obrázku tak přesně to se neaktualizuje, to musím znova F5 aby se to aktualizovalo a to se nachází hodně nad tím (přes include). Doufám, že jsem to teď vysvětlil trochu líp.
_es
Profil
grossik:
Jak se dokončí to percentage_hlidka tak se stránka obnoví, tím pádem se dokončí i ten php kod nad tím
Už v predchádzajúcich tvojich témach sa ti iní snažili vysvetliť, že keď beží JS v prehliadači, tak je už PHP skript, ktorý, okrem iného, vygeneroval aj ten JS kód, obvykle dávno skončený - a to na úplne inom počítači - serveri. Viď aj Základní kurz 15: Komunikace mezi PHP a JavaScriptem.
Keeehi
Profil
grossik:
Nevím, jestli to děláš správně nebo špatně. Pokud jen čekáš na dokončení nějakého eventu, kde dopředu víš, kdy se stane, pak by ten obyčejný reload měl fungovat. Proč by to nemuselo fungovat je, že by vlivem nepřesnosti časovače javascriptu se to načetlo třeba o vteřinu dříve. V tom případě bys pro otestování mohl přidat nějakou rezervu pár vteřin, aby se reload provedl až po třeba dalších 5ti sekundách. Pokud to pomůže, víme kde je problém. Ale klidně to můžeš mít celé logicky špatně, jak jsem psal, nezkoumal jsem to.

Pokud by šlo o event který nevíš kdy se stane. Třeba druhý hráč zaútočí na prvního a ty chceš prvnímu okamžitě zobrazit zprávu, že za hodinu k němu dorazí soupeřovy vojska, tak to už se tak jednoduše dělat nedá. Můžeš sice třeba tu každou sekundu posílat request, jestli se něco změnilo, ale tím si jen zbytečně budeš zahlcovat server. I pár hráčů ti pak vytvoří docela solidní DDOS. Jedna z možností jak to řešit je poslat ten AJAXový požadavek a na serveru čekat s odpovědí, než se něco stane a pak odpovědět. Této technice se říká long polling. Má to tu nevýhodu, že na serveru poběží spousta uspaných procesů. Webservery mají samozřejmě limity na počet spuštěných procesů, počet spojení do databáze atp. Takže zase plýtváš tyto prostředky.
No a pak je možnost, aby server kontaktoval prohlížeč sám. Problémem jsou ovšem starší prohlížeče, zejména explorer. Taky je k tomu potřeba podpora na straně serveru a úplně bych ji neočekával od webhostingů. Takže bys musel provozovat vlastní server. Konkrétně se jedná o Web sockety a nebo Serverové události.
Ovšem je to trochu vyšší dívčí a pokud nezvládáš ani AJAX, pak tohle nebude o nic lepší.
grossik
Profil
_es, Keeehi:
Vím, že to mám špatně udělané, ale funguje mi to, nevím jak to udělat tak aby to bylo úplně v pořádku.

A co se týče tohoto problému, tak to pořád musíme obnovovat vždy ještě jednou i když jsem dal ať se reload provede až po 5ti sekundách.
_es
Profil
grossik [#10]:
Po reloade sa spustí celý PHP skript znova, aj stránka v prehliadači sa celá zruší a načíta celá znovu - aj s JS kódom. Teda keď používaš reload celej stránky, tak to musíš spraviť tak, aby nové opätovné spustenie PHP skriptu vygenerovalo to, čo treba.
grossik
Profil
Jak teda podle vás bych měl udělat, aby vždy, co hráč klikne na tlačítko pro vylepšení budovy se uložila činnost, délka a začátek do databáze

to jsem udělal o to se stará tenhle kod:
$conn = new mysqli($dbserver, $dbusername, $dbpassword, $db);

if ($conn->connect_error)
{
    die("Connection failed: ".$conn->connect_error);
}

$jmeno = $_POST["jmeno"];
$delka = $_POST["delka"];
$stavba = $_POST["stavba"];
$datum = date_create()->format('Y-m-d H:i:s');
$potreba_kamen = $_POST["potreba_kamen"];
$potreba_drevo = $_POST["potreba_drevo"];
$potreba_obili = $_POST["potreba_obili"];

$sql = "INSERT INTO stavba (hrac, zacatek, delka, stavba)
VALUES ('$jmeno', '$datum', '$delka', '$stavba')";

$sql1 = "UPDATE mesto SET drevo = drevo - '$potreba_drevo' WHERE hrac = '$jmeno'";
$sql2 = "UPDATE mesto SET kamen = kamen - '$potreba_kamen' WHERE hrac = '$jmeno'";
$sql3 = "UPDATE mesto SET obili = obili - '$potreba_obili' WHERE hrac = '$jmeno'";

if($conn->query($sql) === TRUE && $conn->query($sql1) === TRUE && $conn->query($sql2) === TRUE && $conn->query($sql3) === TRUE)
{

A jak uběhne ta délka (kterou mám v tabulce v sekundách) tak se přidá produkce a úroveň budovy, ale chci aby hráč měl normálně ukázaný odpočet nad budovou, jak to má například ikariam. Měl jsem to nějak udělané, ale tady jste mi napsali že je to špatně udělané, proto si myslím i že se to nerefreshuje jak má.


Stačí mě jen navést.
_es
Profil
grossik:
Jak teda podle vás bych měl udělat, aby vždy, co hráč klikne na tlačítko pro vylepšení budovy se uložila činnost, délka a začátek do databáze
No konečne zrozumiteľne popisuješ to, čo vlastne potrebuješ.

S reloadom stránky:
Tlačítko je napríklad odosielacie tlačítko formulára - aby PHP skript „vedel“, čo má spraviť.
PHP skript spracuje „vylepšenie budovy“ do databázy a vráti návštevníkovi verziu stránky, kde je aj to „vylepšenie budovy“. Toto riešenie sa vlastne zaobíde bez JS.

Bez reloadu stránky:
Po stlačení tlačítka je odoslaný AJAXový dotaz na server - na PHP skript, ten spracuje „vylepšenie budovy“ do databázy a AJAX dotaz vráti nejaké vhodné dáta, ktoré JS na stránke nejako vhodne spracuje. Toto riešenie vyžaduje JS, výhodou je však, že nedochádza k reloadu celej stránky.
grossik
Profil
_es:
No konečne zrozumiteľne popisuješ to, čo vlastne potrebuješ.
>
S reloadom stránky:
Tlačítko je napríklad odosielacie tlačítko formulára - aby PHP skript „vedel“, čo má spraviť.
PHP skript spracuje „vylepšenie budovy“ do databázy a vráti návštevníkovi verziu stránky, kde je aj to „vylepšenie budovy“. Toto riešenie sa vlastne zaobíde bez JS.

Toto jsem udělal po kliknutí na tlačítko se to uloží do databáze, ale nevím jak správně udělat, aby to na stránce ukazovalo odpočet (jak dlouho se bude ještě stavba vylepšovat) a po skončení tohoto odpočtu se přidala úroveň budově a zvětší se produkce.


Mám to řešené tímto způsobem.

<?php
if(isset($_SESSION['loggedin']))
{
    $dbserver         = "localhost";
    $dbusername     = "root";
    $dbpassword     = "";
    $db             = "mhra";
    
    $conn = new mysqli($dbserver, $dbusername, $dbpassword, $db);
    
    if ($conn->connect_error)
    {
        die("Connection failed: ".$conn->connect_error);
    }
    
    $username = $_SESSION['loggedin'];
    
    $query = "SELECT * FROM stavba WHERE hrac = '$username'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_assoc($result);
    
    $stavba = $row['stavba'];
    $duration='+'.$row["delka"].'seconds';
    $konec_stavby = date('Y-m-d H:i:s', strtotime($duration, strtotime($row['zacatek'])));
    $delka = $row["delka"];
    $cas_aktualne = date('Y-m-d H:i:s');    
    
    $pridat = 1;    
    $pridatprodukce = 0;
    $pridatkapacita = 0;
    
    $stavba2 = $stavba.'_produkce';
    $stavba3 = $stavba.'_level';
    
    $query = "SELECT * FROM budovy WHERE hrac = '$username'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_assoc($result);
    
    $stavba_kamenolom_level = $row['kamenolom_level'];
    $stavba_pole_level = $row['pole_level'];
    $stavba_drevorubec_level = $row['drevorubec_level'];
    $stavba_sklad_level = $row['sklad_level'];
    
    if($stavba3 == "kamenolom_level"){    
        if($stavba_kamenolom_level == 4){
            $pridatprodukce = 5;
        } else if($stavba_kamenolom_level == 3){
            $pridatprodukce = 5;
        } else if($stavba_kamenolom_level == 2){
            $pridatprodukce = 6;
        } else if($stavba_kamenolom_level == 1){
            $pridatprodukce = 9;
        }    
    }
    
    if($stavba3 == "pole_level"){
        if($stavba_pole_level == 4){
            $pridatprodukce = 5;
        } else if($stavba_pole_level == 3){
            $pridatprodukce = 5;
        } else if($stavba_pole_level == 2){
            $pridatprodukce = 6;
        } else if($stavba_pole_level == 1){
            $pridatprodukce = 9;
        }
    }

    if($stavba3 == "drevorubec_level"){
        if($stavba_drevorubec_level == 4){
            $pridatprodukce = 5;
        } else if($stavba_drevorubec_level == 3){
            $pridatprodukce = 5;
        } else if($stavba_drevorubec_level == 2){
            $pridatprodukce = 6;
        } else if($stavba_drevorubec_level == 1){
            $pridatprodukce = 9;
        }
    }
    
    if($stavba3 == "sklad_level")
    {
        if($stavba_sklad_level == 4) {
            $pridatkapacita = 150;
        } else if($stavba_sklad_level == 3){
            $pridatkapacita = 90;
        } else if($stavba_sklad_level == 2){
            $pridatkapacita = 160;
        } else if($stavba_sklad_level == 1){
            $pridatkapacita = 200;
        }
    }
    
    if(($konec_stavby <= $cas_aktualne || $konec_stavby == 0) && $stavba3 != "sklad_level" )
    {
        $sql = "DELETE FROM stavba WHERE hrac = '$jmeno' and stavba = '$stavba'";
        $sql1 = "UPDATE budovy SET $stavba3 = $stavba3 + $pridat where hrac = '$jmeno'";
        $sql2 = "UPDATE produkce SET $stavba2 = $stavba2 + $pridatprodukce where hrac = '$jmeno'";        
        if (mysqli_query($conn, $sql) && mysqli_query($conn, $sql1) && mysqli_query($conn, $sql2))
        {
            echo "";
        }
    }
    
    if(($konec_stavby <= $cas_aktualne || $konec_stavby == 0) && $stavba3 == "sklad_level" )
    {
        $sql11 = "DELETE FROM stavba WHERE hrac = '$jmeno' and stavba = '$stavba'";
        $sql111 = "UPDATE budovy SET sklad_level = sklad_level + 1 where hrac = '$jmeno'";        
        $sql1111 = "UPDATE produkce SET sklad_kapacita = sklad_kapacita + $pridatkapacita where hrac = '$jmeno'";
        if (mysqli_query($conn, $sql11) && mysqli_query($conn, $sql111) && mysqli_query($conn, $sql1111))
        {
            echo "";
        }
    }    
    
?>    

<?php
$sql = "SELECT hrac, stavba FROM stavba WHERE hrac = '$username'";
if($result=mysqli_query($conn,$sql))
{
    $rowcount = mysqli_num_rows($result);
}

if($rowcount == 1) { ?>
<script>
var start = + new Date();
var konec = <?php echo strtotime($konec_stavby) * 1000; ?>;
    
var interval = window.setInterval(function() {    
    
    var cas_aktualne = + new Date();    
    var prave_delka = konec - cas_aktualne;

    var seconds = Math.floor((prave_delka / 1000) % 60);
    var minutes = Math.floor((prave_delka / (60 * 1000)) % 60);        
    var hours = Math.floor((prave_delka / (60 * 60 * 1000)) % 60);    
    
    var delka = <?php echo $delka * 1000 ?>;
    var percentage_hlidka = (prave_delka/delka) * 264;
    document.getElementById('cas_zbyva').innerHTML = hours + "h " + minutes + "m " + seconds + "s";
    
    <?php if($stavba == "kamenolom") { ?>
            $("#cas_zbyva").css("top", "335px");
            $("#cas_zbyva").css("left", "740px");
    <?php } 
          if($stavba == "pole") {?>
            $("#cas_zbyva").css("top", "90px");
            $("#cas_zbyva").css("left", "295px");
    <?php } 
          if($stavba == "drevorubec") {?>
            $("#cas_zbyva").css("top", "445px");
            $("#cas_zbyva").css("left", "70px");            
    <?php } 
         if($stavba == "sklad") { ?>
            $("#cas_zbyva").css("top", "195px");
            $("#cas_zbyva").css("left", "535px");        
    <?php } ?>

         
    if(percentage_hlidka <= 0) {
        window.clearInterval(interval);
        location.reload();
    }    
}, 1000);    

</script>

<?php }?>
_es
Profil
grossik [#14]:
Obávam sa, že tvoje súčasné vedomosti a schopnosti nestačia na uvedenú aplikáciu. Riešiš nejaké podrobnosti, pritom máš nejasno v základnom návrhu aplikácie a pod.

...jak správně udělat...
To si už musíš navrhnúť a naprogramovať sám. To by už vlastne skoro znamenalo, že to za teba celé spraví niekto iný.
Zobrazovanie odpočtu: To predsa spraviť vieš, či nie?
Po skončení odpočtu...: Ak to chceš robiť cez reload tak predsa „reloaduješ“ celú stránku. Môžeš vyjsť napríklad z Odpočítávání k určitému datu a hodině akurát namiesto vypísania „hlášky“ „reloaduješ“ stránku.
grossik
Profil
Tak už jsem to vyřešil sám, problém byl přesně jak jste tady psali, že ten php kód se spustil vždy při obnovení stránky, takže jsem jsem ho předělal a dal do jiného souboru na který odkazuju přes ajax po tom, co se dokončí percentage_hlidka. Vše funguje jak má, děkuju všem moc.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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