Autor | Zpráva | ||
---|---|---|---|
hypot Profil |
#1 · Zasláno: 3. 4. 2018, 14:29:58
Zdravím, chtěl bych poslat data z prohlížeče na server do souboru PHP (vložit je do pole), ale nedaří se mi to a nezbývá mi než si nechat poradit, jak to zprovoznit.
Konkrétně jde o obsah určitých částí HTML dokumentu zaslaný jako reakce na událost, ale to snad není tak důležité. Funkčnost zatím zkouším na localhostu. Tady je můj Javascript (část z něj): var ajax = new XMLHttpRequest; ajax.open("POST", "002.php"); ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); var ajax_predmet = "predmet=" + item.firstChild.nodeValue; // (item je - na okraj - event.target) ajax.send(ajax_predmet) if (isset($_POST["predmet"])) $obdrzene = $_POST["predmet"]; if (isset ($obdrzene)) echo $obdrzene; // $items = []; // array_push($items, $obdrzene) |
||
Radek9 Profil |
#2 · Zasláno: 3. 4. 2018, 15:02:00
hypot:
„Když ovšem načtu soubor 002.php v prohlížeči“ Počkej. Kontroluješ to, co ti ten ajax vrací? XMLHttpRequest má událost onreadystatechange, ve které dostaneš odpověď od serveru: ajax.onreadystatechange = function () { if (ajax.readyState === 4 && ajax.status === 200) { alert(ajax.responseText) } } Je logické, že když si otevřeš tu stránku přímo v prohlížeči, tak je hodnota proměnné $_POST prázdná. V tu chvíli nic serveru neposíláš. |
||
Časová prodleva: 3 dny
|
|||
hypot Profil |
#3 · Zasláno: 6. 4. 2018, 14:03:19
Radek9:
„Je logické, že když si otevřeš tu stránku přímo v prohlížeči, tak je hodnota proměnné $_POST prázdná. V tu chvíli nic serveru neposíláš.“ Přiznám se, že ať nad tím dumám, jak nad tím dumám, stále tomu nerozumím. Javascript mám připojený k souboru 001.php a text chci poslat do souboru 002.php (to jsem zřejmě měl uvést hned). V souboru 001.php kliknu na určitý prvek s textovým obsahem a onen textový obsah chci přenést do souboru 002.php, který by ho měl pro začátek aspoň vypsat. Odpověď serveru jsem do Javascriptu původně nezařadil, jelikož jsem soudil, že ji k ničemu nepotřebuju, nicméně když jsem ji na radu přidal, dostal jsem jako výsledek textový obsah prvku, na který jsem klikl, což je přesně ta informace, kterou jsem chtěl přenést. Jak to tedy je - posílám něco nebo neposílám? |
||
Keeehi Profil |
#4 · Zasláno: 6. 4. 2018, 14:36:34
Javascriptem to posíláš. Ovšem když si v prohlížeči jen otevřeš soubor 002.php tak při tom se žádná data neposílají.
|
||
_es Profil |
#5 · Zasláno: 7. 4. 2018, 00:33:38
hypot:
Keeehi: „Ovšem když si v prohlížeči jen otevřeš soubor 002.php tak při tom se žádná data neposílají.“ A okrem toho nie je vtedy ani použitá metóda post ale get .
|
||
hypot Profil |
#6 · Zasláno: 7. 4. 2018, 18:49:41
No jo, když člověk nechápe podstatu, je to na tom to nejhorší. :-(
Keeehi: „Ovšem když si v prohlížeči jen otevřeš soubor 002.php tak při tom se žádná data neposílají.“ Samozřejmě že chápu, že kdybych měl vedle sebe předem v prohlížeči otevřené soubory 001.php a 002.php a z prvního něco odeslal ajaxem, že se to hned v tom druhém nemůže hned samo od sebe nějak magicky projevit, ale to já nedělám. Já jsem měl (respektive zatím stále mám) za to, že když z prohlížeče nejprve zašlu na server ajaxem nějaké údaje a teprve poté si od něj do prohlížeče vyžádám soubor, který má nakládat (např. je zobrazit) s odeslanými údaji, v okamžiku vyžádání toho druhého souboru (v mém případě 002.php) už server bude mít odeslané údaje k dispozici a může mi je tedy v požadované stránce poskytnout. Jenže je neposkytuje. Jak to, že je teda k dispozici nemá? _es: „A okrem toho nie je vtedy ani použitá metóda post ale get .“
Použitá nebo použitelná? Má to na něco vliv? |
||
Keeehi Profil |
hypot:
„Jak to, že je teda k dispozici nemá?“ Protože to jsou dva oddělené požadavky. Každý požadavek na server je sám o sobě. HTTP je totiž bezstavový protokol. To znamená, že stav (zjednodušeně data) se nepřenášejí mezi požadavky. Když tedy pošleš na server v požadavku nějaká data, server s nimi může v rámci daného požadavku pracovat. Jakmile ale sestaví odpověď a pošle ti ji nazpět, tak všechno zapomene. Když pak tedy pošleš na server druhý požadavek (otevřeš si stránku 002.php), tak server o těch datech už dávno neví. Aby k nim měl přístup, musel by si je server v prvním požadavku někam uložit a při druhém je opět načíst. Existuje několik možností jak přenášet data mezi požadavky s různým stupněm trvanlivosti těchto dat. Ovšem pro debugování AJAXu to není potřeba. Jak už psal Radek9 v [#2], celá odpověď ze serveru se po dokončení AJAXového požadavku bude nacházet v ajax.responseText kterou si můžeš někam vypsat. Druhou možností je použít vývojářské nástroje, které jsou vestavěné v prohlížečích. Když si je zapneš a odešleš AJAXový požadavek, tak v části Síť / Network (může se jmenovat jinak) se objeví tvůj požadavek. Po kliknutí na něj si můžeš zobrazit hlavičky, celou odpověď aniž bys ji musel v javascriptu vypisovat a spoustu dalších užitečných věcí. img.djpw.cz/sqh.gif
|
||
hypot Profil |
#8 · Zasláno: 9. 4. 2018, 09:06:42
Keeehi:
„Aby k nim měl přístup, musel by si je server v prvním požadavku někam uložit a při druhém je opět načíst.“ Já už možná začínám tušit, v čem chybuju. Já jsem myslel, že obsah polí $_GET, $_POST a $_REQUEST je dostupný všem skriptům (stránkám) na stejné doméně (že jde o něco jako sessionStorage v prohlížeči); ale ono to tak asi není, že? |
||
Radek9 Profil |
#9 · Zasláno: 9. 4. 2018, 09:10:13
hypot:
Správně. Jsou dostupné vždy jen v rámci jednoho konkrétního požadavku. V tvém případě je jeden požadavek ten ajax (tam ta data opravdu posíláš a také skutečně dostaneš odpověď) a druhý je to přímé otevření stránky. V tu chvíli mají oba požadavky rozdílná data a proto se chovají jinak. |
||
hypot Profil |
#10 · Zasláno: 9. 4. 2018, 18:59:50
Takže když budu chtít něco ukládat na serveru, aby to bylo přístupné odevšad, musím to uložit do souboru?
|
||
Radek9 Profil |
#11 · Zasláno: 9. 4. 2018, 19:09:21
hypot:
Stačí do $_SESSION . Ta je navíc pro každého uživatele unikátní. Soubor bys měl společný pro všechny uživatele. Otázka ale je, k čemu konkrétně to potřebuješ a jestli se to nedá vyřešit jinak.
|
||
Keeehi Profil |
#12 · Zasláno: 9. 4. 2018, 23:56:14
hypot:
Jak jsem psal, možností je spousta. Cookie, session, soubor, databáze - to jsou asi ty nejběžnější. Ale pro ajax ani pro jeho debugging nejsou potřeba. |
||
hypot Profil |
#13 · Zasláno: 11. 4. 2018, 10:34:24
Je se zeptám ještě na jednu věc, která mi není jasná:
Jak jsem napsal, chtěl jsem přenést textový obsah určitých částí dokumentu na server a tam uložit do pole. V PHP jsem na uložení poslaných dat použil tento kód: if (isset($_POST["predmet"])) $obdrzene = $_POST["predmet"]; if (!isset ($items)) $items = []; if (isset($obdrzene)) array_push ($items, $obdrzene); echo "<script>console.log(" + print_r($items) + ")</script>" |
||
Keeehi Profil |
Každé volání AJAXu je samostatný požadavek. Mezi jednotlivými volání se data zapomenou. Píšeme ti to tu stále dokola, tak už na to začni myslet.
Pokud by jsi na uložení dat zvolil session (což může a nemusí být správná varianta) mohl by kód vypadat takto: if (isset($_POST['predmet'])) { if (!isset ($_SESSION['items'])) { $_SESSION['items'] = []; } array_push ($_SESSION['items'], $_POST['predmet']); echo json_encode($_SESSION['items']); } To uložení do pole by se dalo zapsat kratším zápisem ale pro jednoduchost jsem použil tvůj zápis. Pro vypsání hodnot jsem zvolil správný postup. To co ten skript vypíše se bere jako obyčejný text. Proto jakýkoli jevascript je ve výstupu zbytečný, jelikož se nebude interpretovat. Je zvykem přenášet data mezi PHP a JS ve formátu JSON. Vypsání dat do konzole by tedy pak mělo vypadat takto: ajax.onreadystatechange = function () { if (ajax.readyState === 4 && ajax.status === 200) { console.log(JSON.parse(ajax.responseText)) } } |
||
Časová prodleva: 6 let
|
0