Autor Zpráva
Legáček
Profil
Zdravím už zase :(
Asi před 3-4 měsíci jsem zde psal poprvé na fórum ohledně PHP v naprosté nevědomosti jak tento skriptovací jazyk funguje. Nyní nemám sebemenší problém v něm pracovat, i když někdy složitě, ale přesto se mi vždy povede všeho docílit, nyní mám problém nevědomosti s Ajaxem takže k věci...
Mám číslo 120 uložené v mysql, které bych potřeboval pomocí Ajaxu vždy po vteřině o 1 odečíst a když se rovná 0 zas vrátit na 120 zkoušel jsem to asi takhle.
  <script language="javascript">
  var XMLHttpRequestObjekt = false;
    
    if (window.XMLHttpRequest){
      XMLHttpRequestObjekt = new XMLHttpRequest();
    } else if (window.ActiveXObject){
     XMLHttpRequestObjekt = new ActiveXObject("Microsoft.XMLHTTP");
    }
  
  function ziskejData(){    
    if(XMLHttpRequestObjekt){
    XMLHttpRequestObjekt.open("GET", "zkouska.php?g=1", true);      
      XMLHttpRequestObjekt.onreadystatechange = function()
      { 
        if (XMLHttpRequestObjekt.readyState == 4 && XMLHttpRequestObjekt.status == 200){
         document.getElementById("cilovyDiv").innerText = XMLHttpRequestObjekt.responseText;
        }
      }
      window.setInterval('ziskejData()', 1000);
      XMLHttpRequestObjekt.send(null);
    }  
  }

  </script>

zkouska.php
<?php
$connect = mysql_connect("**","**","**") or die("Nemůžu načíst mysql.");
$db = mysql_select_db("vyber") or die("Nemůžu načíst db.");
$jzk = mysql_query("SET NAMES 'cp1250'");

if (isset($_GET['g'])){
  $smeny_hodnota = mysql_query("SELECT cas FROM smeny WHERE id=1 ");
  $smeny_hodnota_fa = mysql_fetch_array($smeny_hodnota);
  $zmena_hodnoty = $smeny_hodnota_fa['cas']-1;
  if($zmena_hodnoty == 0){$zmena_hodnoty = 120;}
  echo $zmena_hodnoty;
  $smeny = mysql_query("UPDATE smeny SET cas='$zmena_hodnoty' WHERE id=1 ");
  }
?>

Věřte mi, že takhle dlouho jsem se nezasmál nad programování - zatěžuji asi(určitě) server - asi po 10s začne text blikat a víc a víc až nakonec zmizí =D samozřejmě odpočítávání po vteřině se zrychluje a zrychluje, takže to pak už opravdu není vteřina. Je to určitě začátečnická hnusná chyba. Četl jsem různé návody, ale nějak mi to nedocvakává jak bych to jinak měl dělat. Děkuji za jakoukoliv odpověď (zde na JS jsou odpovědi zázrakem :))
Chamurappi
Profil
Reaguji na Legáčka:
Každou sekundu nastavuješ jednosekundový interval (tedy opakující se časovač). Po deseti sekundách ti naráz běží tisíc časovačů. Asi bys chtěl raději používat setTimeout.

Mimochodem, innerText ti bez dodatečného skriptu asi nepojede ve všech prohlížečích.
Legáček
Profil
Chamurappi:
Asi bys chtěl raději používat setTimeout.
Asi určitě ano, děkuji ti za radu - všelico jsem si s tím uvědomil.

Stačí, když přeměním innerText za innerHTML, zatím.. Pochopil jsem snad dobře že rozdíl mezi těmito vlastnosti je jen v tom, že innerText je pro výpis jednoduchého textu a innerHTML je pro výpis textu i html značek. Ještě jednou díky ;)

// eh v IE to nefunguje jak má asi nestačí jen změnit na innerHTML =D + ani nedojede k odečítání(zkouska.php), takže teď nevím jestli to je tím innerHTML nebo ne..
_es
Profil
Legáček:
To načítavanie zo servera každú sekundu, ak by to aj správne fungovalo, je dobré na čo?
Sprav to nejako inak.
Legáček
Profil
_es:
No ale to jsem ještě nepochopil přemýšlel jsem nad tím fakt dlouho, jak kontrolovat každou vteřinu jestli se číslo v mysql změnilo (protože já vím že se změnilo), ale nechápu jak jinak to udělat. Určitě jste taky někdy chtěli kontrolovat jest-li se v mysql něco nezměnilo třeba i po 2 minutách. Já jsem v JS fakt na začátcích - přemýšlel jsem teoreticky by šlo abych to kontroloval po minutě, myslíte že v tomto je jediné východisko?
xmark
Profil
Legáček:
kontrolovat každou vteřinu
abych to kontroloval po minutě

Rozmysli si, jak často tu akci musíš udělat a nedělej ji častěji. Minuta a sekunda je rozdíl.
Legáček
Profil
xmark:
Udělal jsem to teda.Sice asi složitě, ale odečítá to až po minutě! Ale stejně to nepomáhá ... Jen v IE to prostě nejde!!! Mozilla, Opera, a chrom nemají problém!
zkouskovy.php
function ziskejData(id,odpocet){    
    if(XMLHttpRequestObjekt){
    XMLHttpRequestObjekt.open("GET", "zkouska.php?id="+id+"&od="+odpocet, true);      
      XMLHttpRequestObjekt.onreadystatechange = function()
      { 
        if (XMLHttpRequestObjekt.readyState == 4 && XMLHttpRequestObjekt.status == 200){
          document.getElementById("cilovyDiv").innerHTML = XMLHttpRequestObjekt.responseText;
          var text = document.getElementById("cilovyDiv").firstChild.nodeValue;
          if(text == 0){
            var idn = (id * 1) + 1;
            var od = 0;
            window.setTimeout('ziskejData('+idn+','+od+')', 5000); // Jestliže je v mysql 0 přepnu na jiného uživatele který má 120, proto nic neodečtu, abych se zas dostal na 120 a mohl pokračovat...
            }
          if(text == 120){
            var od = 60;
            window.setTimeout('ziskejData('+id+','+od+')', 60000); // Zjistil jsem že v mysql je 120 tak to zapnu až po minutě a odečtu 60
            }
          if(text == 60){
            var od = 60;
            window.setTimeout('ziskejData('+id+','+od+')', 60000); // Zjistil jsem že v mysql  nyní 60 tak to zapnu až po minutě a odečtu 60
            }  
          }
        }
      XMLHttpRequestObjekt.send(null);
    }  
  }

zkouska.php
if (isset($_GET['id']) && isset($_GET['od'])){
  $smeny_hodnota = mysql_query("SELECT * FROM smeny WHERE id='".$_GET['id']."'");
  $smeny_hodnota_fa = mysql_fetch_array($smeny_hodnota); // Jaká je hodnota časová, udávaného id?
  $zmena_hodnoty = $smeny_hodnota_fa['cas'] - $_GET['od']; // Zde jen odečítám hodnoty co mi přijdou od javascriptu
  $smeny = mysql_query("UPDATE smeny SET cas='$zmena_hodnoty' WHERE id='".$_GET['id']."' ") or die (mysql_error()); // zapíšu novou hodnotu
  }
_es
Profil
Legáček:
Do setTimeout dávaš nevhodný parameter. Asi používaš stále ten istý objekt vrátený z funkcie XMLHttpRequest, nie je to doporučované. Pre každý dotaz vyrob nový objekt.
Legáček
Profil
_es:
Tak dobře začal jsem úplně od začátku šel jsem na univerzální funkce pro Ajax..zkopíroval jsem to vytvořil nový php vložil to tam udělal div a nové tlačítko s
onClick="ajax('zkouska.php','cilovyDiv')
podle návodu v zkouska.php jsem napsal
echo "Ahoj";

Spustil jsem IE kliknul na talčítko napsalo mi to Ahoj - paráda jsem šťastnej že to funguje. Nechám IE spuštěný, jen přepíšu "Ahoj" na "Hello world" v zkouska.php. Uložím vlezu na IE dám F5 a zmáčknu opět tlačítko a zobrazí se mi tam "Ahoj" ? Když tenhle samí postup udělám v Opeře nebo Mozille nebo Chromu vše excelantně přepíše "ahoj" na "Hello world". V čem je chyba už ani to blbí setTimeout nepoužívám! :(
_es
Profil
Legáček:
V čem je chyba
Zabezpeč, aby bola pri každom dotaze iná adresa súboru, napríklad:
onclick="ajax('zkouska.php?r=' + Math.random(), 'cilovyDiv')
Legáček
Profil
_es:
O_o Vše funguje i v IE, dosadil jsem podle tvého příkladu do
 XMLHttpRequestObjekt.open("GET", "zkouska.php?r=" +Math.random()+"&id="+id+"&od="+odpocet, true);
Já bych nikdy nezakládal diskuzi kdybych neměl aspoň nějakou myšlenku jak to udělat, ale jak mě má trknout že tam mám dát + Math.random() + to opravdu nepochopím?!
_es
Profil
Legáček:
jak mě má trknout že tam mám dát + Math.random() + to opravdu nepochopím?!
www.jakpsatweb.cz/enc/cache.html
Legáček
Profil
_es:
Yeees, takže prostě nedostatek znalostí, je mi to jasný =)) Díky ti ...
Witiko
Profil
Legáček:
Zabránit kešování lze i jinak - např. pohráváním si s hlavičkami žádosti, případně změnit hlavičku odpovědi, tzn.:

<? 
  header("Cache-Control: no-cache, must-revalidate");
  ...
?>
_es
Profil
Witiko:
Zabránit kešování lze i jinak
no nespoľahlivo, riešenie v [#10] je jednoduché a účinné.
Legáček
Profil
Witiko:
Děkuji za info, když jsem četl odpověď od _esa co je to cache, tak jsem se dozvěděl i to, že to jde změnit jinak, takže když mi něco nepůjde zkusím jiným způsobem.
candiess
Profil
Legáček:
zaujala mě struktura toho ajaxu a vzpoměl jsem že jsem to přej tento ajax dělal taky, jen se mi postupně hromadily tyto skripty a chtělo to změnu, měl by sis začít ohmatávat JQuery, je to velice užitečný pomocník, odesílání skriptu probíhá pomocí
$.get(url, function(vystup) {
$("#nejakyDiv").html(vystup);
});

to je jen malá ukázka, čeho všeho je JQuery schopen ulehčit..:))
viz. tady
zkus si o tom něco přečíst, uvidíš že se ti hodně věcí zpřehlední a ulehčí :)
Chamurappi
Profil
Reaguji na candiesse:
Zpřehlednit to jde i bez jQuery a na problém s kešováním by narazil úplně stejně.
J
Profil *
"onclick="ajax('zkouska.php?r=' + Math.random(), 'cilovyDiv')"

možná by bylo bezpečnější použít spíš Date() a getTime() než random()
var d = new Date();
onclick="ajax('zkouska.php?r=' + d.getTime(), 'cilovyDiv')

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:

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