Pri vývoji ajaxových aplikácií Vue.js som po rokoch konečne zistil, ako používať ajax v PHP a ako prijímať údaje metódou POST.
$_POST
je k dispozícii len pre formuláreV PHP je bežne k dispozícii superglobálna premenná $_POST
, ktorá uchováva odoslané údaje z formulára.
Jeho používanie je relatívne jednoduché.
Na strane HTML je potrebné vytvoriť formulár:
A potom v súbore process.php
môžu byť hodnoty prístupné ako prvky poľa:
echo htmlspecialchars($_POST['username'] ?? '');
Upozornenie:
Pri tomto jednoduchom prístupe môže mať každý pocit, že POSTované dáta sú automaticky definované ako indexy poľa v premennej
$_POST
. Ale to nie je pravda!
Dôvodom, prečo sa údaje odoslané z formulára pomocou metódy POST zapisujú do premennej $_POST
, je skutočnosť, že prehliadač pri odosielaní formulára HTML automaticky odosiela hlavičku HTTP 'Content-Type': 'application/x-www-form-urlencoded'
.
Bez správne nastavenej hlavičky sa k hodnotám jednoducho nedá dostať a musíme použiť trikové riešenie.
Pri pokuse o odosielanie údajov pomocou ajaxu musíme na strane PHP trochu zmeniť prístup. Podrobnosti si môžete prečítať v diskusii na Facebooku.
V javascripte môžete napríklad použiť knižnicu axios na odosielanie údajov pomocou ajaxu. Ak ho chcete jednoducho používať, stačí prepojiť javascript zo servera CDN a hneď ho používať:
V tomto jednoduchom prípade sa URL adresa '/api/form-process'
zavolá pomocou ajaxu a metóda POST odovzdá objekt { meno používateľa: 'Meno používateľa' }
. Samotná knižnica sa už o logistiku odovzdávania údajov stará automaticky, takže sa odosielajú serializované ako Json. V reči frontendových vývojárov sa to nazýva json payload.
Na strane PHP by som očakával, že sa použije ako formulár (koniec koncov, bola to metóda POST):
echo htmlspecialchars($_POST['username'] ?? '');
V tomto prípade však bude pole $_POST
prázdne a nebudú odovzdané žiadne údaje. Premenná $_POST
sa používa len pre údaje získané z formulárov (môžete to zistiť podľa hlavičky HTTP, ktorú sme nevyhodili).
V tomto prípade teda potrebujeme získať údaje priamo z požiadavky HTTP, na čo sa používa trick solution. Potom sa ľahko používa:
$data = json_decode(file_get_contents('php://input'), true);echo htmlspecialchars($data['username'] ?? '');header('Content-Type: application/json');echo json_encode(['message' => "Server creeper,]);die;
Ako príklad uvádzam aj jednoduchú javascriptovú odpoveď. Dôležité je správne vyhodiť hlavičku HTTP 'Content-Type: application/json'
a ukončiť skript po odoslaní všetkých údajov.
$_POST
Ak aj napriek tomu chcete s odoslanými údajmi zaobchádzať priamo ako s formulárom, existuje spôsob, ako ich preniesť. V tomto prípade je potrebné upraviť vytvorenie samotného dotazu ajax a správne odovzdať hlavičky HTTP:
axios.post( '/api/form-process', { username: 'Jméno uživatele' }, { headers: {'Content-Type': 'application/x-www-form-urlencoded'} } ).then(response => { // Nějaké zpracování });
V tomto prípade však spracovanie na strane PHP nebude príjemné, pretože údaje musíme ešte opraviť a previesť na pole.
Podarilo sa mi vymyslieť túto hrôzu:
if (\count($_POST) === 1&& preg_match('/^\{.*\}$/', $post = array_keys($_POST)[0])&& ($json = json_decode($post)) instanceof \stdClass) {foreach ($json as $key => $value) {$_POST[$key] = $value;unset($_POST[$post]);}}echo htmlspecialchars($_POST['username'] ?? '');
Je však oveľa lepšie držať sa prvého prístupu a na získanie údajov použiť metódu 'php://input'
.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | sk