Autor | Zpráva | ||
---|---|---|---|
Legáček Profil |
#1 · Zasláno: 7. 2. 2011, 16:38:08
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 |
#2 · Zasláno: 7. 2. 2011, 16:43:24 · Upravil/a: Chamurappi
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 |
#3 · Zasláno: 7. 2. 2011, 20:43:46 · Upravil/a: Legáček
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 |
#4 · Zasláno: 8. 2. 2011, 03:20:48
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 |
#5 · Zasláno: 8. 2. 2011, 14:14:18
_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 |
#6 · Zasláno: 8. 2. 2011, 14:24:48
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 |
#7 · Zasláno: 8. 2. 2011, 15:54:57
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 |
#8 · Zasláno: 8. 2. 2011, 16:38:10
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 |
#9 · Zasláno: 8. 2. 2011, 17:56:09
_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') 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 |
#10 · Zasláno: 8. 2. 2011, 18:33:37
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 |
#11 · Zasláno: 8. 2. 2011, 20:21:34
_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); |
||
_es Profil |
#12 · Zasláno: 8. 2. 2011, 20:31:54
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 |
#13 · Zasláno: 8. 2. 2011, 20:34:59
_es:
Yeees, takže prostě nedostatek znalostí, je mi to jasný =)) Díky ti ... |
||
Witiko Profil |
#14 · Zasláno: 8. 2. 2011, 20:50:12 · Upravil/a: Witiko
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 |
#15 · Zasláno: 8. 2. 2011, 21:04:00
|
||
Legáček Profil |
#16 · Zasláno: 8. 2. 2011, 22:13:22
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. |
||
Časová prodleva: 4 dny
|
|||
candiess Profil |
#17 · Zasláno: 12. 2. 2011, 14:02:19
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 |
#18 · Zasláno: 12. 2. 2011, 18:46:37
Reaguji na candiesse:
Zpřehlednit to jde i bez jQuery a na problém s kešováním by narazil úplně stejně. |
||
Časová prodleva: 4 měsíce
|
|||
J Profil * |
#19 · Zasláno: 1. 6. 2011, 01:03:50
"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') |
||
Časová prodleva: 13 let
|
0