Diskuze: jak javascriptem zavolat *.php soubor a počkat na návratovou hodnotu
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
nakonec jsem se v tom ztratil. Funguje ti ten PHP script? Pošli kód AJAXu?
tímhle způsobem POSTuju z js do php
$.ajax({
type: "POST",
url: "read.php",
data: 'item=' + item,
cache: false,
success: function (html) {
alert("WIN");
}
});
a tohle mám v php
<?
require ("pripojeni_db.php");
$result = mysql_query("SELECT Value FROM $item order by Time desc limit 1");
while ($row = mysql_fetch_array($result)) {
$value = $row["value"];
}
echo $value;
?>
abych to nějak zjednodušil..problém vzniká v tom že ten druhej ajax :
function recieveVal() {
function reqListener () {
console.log(this.responseText);
}
var oReq = new XMLHttpRequest();
oReq.onload = function() {
alert(this.responseText);
};
oReq.open("get", "read.php", true);
oReq.send();
}
function selSetter() {
}
funguje na principu force connect..žádný čekání na to až php něco udělá to ajax je iniciátorem a já bych potřeboval z tohohle hlediska spíš opak ..POST ať spouští ajax okej...ale návratovou hodnotu z PHP, to ať radši iniciuje php, jinak tam v té proměnné $value nic nebude žejo
oReq.onload se ti zavolá ihned po zavolání metody open nebo send (teď nevím přesně, ale jedné z těch), potřebuješ obsluhovat onreadystatechange. To se zavolá několikrát, jakmile bude readyState == 4 a statusCode == 200 tak tam máš data.
takže ty data tam budou i když ten POST vlastně dělá něco úplně nezávisle na tohle...přijde mi to dosti nezávislý..dokonce jsem měl pocit že na sebe tyhle dvě "relace" ani nevidí..po pravdě ale nevím jak mám udělat to co mi doporučuješ..prosím ještě to trochu rozveď abych byl alespoň schopný si to nějak vyhledat..
co ti vipíše ten alert v druhém kódu? Undefined? null? něco podobného?
v druhém kódu máš obsluhu události onload pro ten requst, který tam skládáš. uvnitř te obsluhy pak kontroluješ responseText,a le když si tam dáš breakpoint zjistíš, že v nich nic není, rpotže request je sice načtený (onload) ale nemá data ze serveru, proto jsem ti psal, že místo onload máš obsluhovat onreadystatechange, tam mít podmínku jestli je statusCode == 200 a vtom případě teprve zpracovat data.
takže něco takového? -->
var oReq = new XMLHttpRequest();
oReq.onreadystatechange = function() {
//A sem teď if?
alert(this.responseText);
};
oReq.open("get", "read.php", true);
oReq.send();
zkus to trochu polopatě..to co tam dělám s ajaxem je mi už samo o sobě z 75% tajemstvím ..ale bohužel se bez toho neobejdu
jo
if (oReq.statusCode == 200) {
// alert
}
tak to jsem teď provedl a mám několik pochybností, jednak takhle zapsaná podmínka znemožní provedení toho co je uvnitře, protože stačí aby jednou nebylo (oReq.statusCode == 200) rovno true a jelikož tu není žádný čekání a pokus o opakování tak se to prostě neprovede...jednak když jsem tam dal tohle
if (oReq.statusCode == 200) {
alert(this.responseText + "tohleto?");
}
else {
alert(oReq.statusCode);
}
tak v else alert vyhodí undefined... což znamená že těch 200 nemůže mít nikdy když je undefined nakonec naprosto globální problém ...tenhle příkaz jen přimějeread.php aby mi vydal první echo co tam je napsaný, ale jelikož nic nepředává sám ..žádný item ...tak $value který jsem tam chtěl echnout bude stejně pořád prázdný...co s tím?
kód 200 samozřejmě je a funguje, tady máš odkaz k dokumentaci na w3c http://www.w3.org/…6-sec10.html#… opětovně ti to zavolá JavaScript, mimo podmínku si do konozle vypieš
console.log("Zavolalo se to");
a podívej se kolikrát ti totam vypíše. V tom že 200 tam nemusí dojít máš částečně pravdu,ještě tam může být třeba 30X (při přesměrování) nbeo 40X při chybě. Ale ten status code tam nějaký bude.
tak jsem zjistil čím to bylo, že se ti nikdy neprovedlo a že statusCode je undefined... je to jenom status... tedy kód má vypadat takhle
if (oReq.status == 200) {
alert(this.responseText + "tohleto?");
}
pak to vypisuje echo z phpčka...problém je ale v tom, že stále nefunguje to co jsem říkal už na začátku..že tímto zpusobem bude echovat prázdnou hodnotu protože druhej ajax nepředává phpčku parametr, který by kod použil pro kontaktování databáze...co doporučuješ?
možná jsem si domyslel o co se snažíš. Děláš nějaký přepínátko (toogleswitch), které bude měnit hodnotu na serveru. Do databáze budeme ukládat jedničku nebo mínus jedna. V scriptu PHP (change.php abychom zachovali rozumné názvy) vezmeme tu hodnotu vynásobíme -1 a uložíme novou. V JavaScriptu AJAXem zavoláme tento script.
var req = new XMLHttpRequest();
req.open("GET", "change.php");
req.send();
// změníš hodnotu u uživatele
pak si ještě dáš PHP script read.php, který ti tu jedničku nebo mínus jedna vrátí a v JavaScriptu si to načteš.
var req = new XMLHttpRequest();
req.open("GET", "change.php");
req.onreadystatechange = function () {
if (req.status == 200) {
if (req.responseText == "1") {
// posuneš tlačíto na ON
} else {
// posuneš tlačíto na OFF
}
}
}
req.send();
myslím, že jsi přesně pochopil co mám na mysli...jen to ještě upřesním aby to bylo jisté...ošetřuji situaci kdy např. mám server s databází a apachem a javou ...do databáze se připojuje java která když vidí že nějaká položka je nastavená na On tak třeba rozsvítí světlo ... tohle je jasný nechci se v tom zamotat...ale teď jde o webovou aplikaci kterou budeš ty světla ovládat.. tu aplikaci může mít v mobilu nebo kompu deset lidí..a je nutný aby když jeden udělá změnu aby se to změnilo všem..takže zatím pracuju jen na tom aby se to správně nastavilo podle reálných stavů světel při refreshnutí stránky ...taky jasný..zase se do toho nechci zamotat..ale shrnuto a podrtrženo znamená to, že nejenom, že bude togle switch měnit stav v databázi...to už mimochodem v pohodě běhá...ale navíc se ten switch musí nějak dozvědět stav v databázi řekněme jak při načtení tak každý 3 sekundy.. a na to potřebuju aby js zavolal phpčko předal mu postupně všechny přepínače který na stránce jsou..protože nikdo neříká že musí být všechny na webu co jsou v databázi a pak podle toho jeden za druhým nastavil do polohy podle databáze...vlastně jsem před nějakou dobou našel příklad tady http://www.w3schools.com/…database.asp a myslím, že se to nejvíc podobá tomu co chci udělat..a navíc se to shoduje s tím co jsi teď napsal ty..takže bych řekl, že mě chápeš dobře
a co teď řešíme?
Btw. hledáš WebSockets API
No...teď přepisuju staré nepoužitelné řešení tím novým založeným na tom co píšeš ty a co je v tom DEMU na W3School ...když bude fungovat v pohodě, když ne ...asi se podívám na to co dělá WebSocket API, když říkáš, že tohle hledám. každopádně si moc cením tvého zájmu a času, který jsi mi věnoval. Zatím velké Díky.
WebSocket ti umožní komunikaci se serverem real-time. Až budeš mít připojených více klientu, aby se když jeden změní hodnotu, to projevilo všem.
Zobrazeno 16 zpráv z 16.