POST požadavky zpracováváme v PHP. NodeJS. Jak zpracovat požadavky POST Zpracování požadavků http php

Klienti prohlížeče mohou odesílat informace na webový server.

Než prohlížeč odešle informace, zakóduje je pomocí schématu zvaného kódování URL. V tomto schématu jsou páry název/hodnota zřetězeny znaménkem rovná se a různé páry jsou odděleny ampersandem.

Jméno1=hodnota1&název2=hodnota2&název3=hodnota3

Mezery jsou odstraněny a nahrazeny znakem + a všechny ostatní nealfanumerické znaky jsou nahrazeny hexadecimálními hodnotami. Jakmile jsou informace zakódovány, jsou odeslány na server.

metoda GET

Metoda GET odesílá zakódované informace o uživateli připojené k požadavku na stránku. Jsou stránky a zakódované informace od sebe odděleny? otazník.

http://www.test.com/index.htm?name1=value1&name2=value2

  • Metoda GET vytvoří dlouhý řetězec, který se objeví v protokolech vašeho serveru v poli "Umístění" prohlížeče.
  • Metoda GET je omezena na odesílání pouze 1024 znaků.
  • Nikdy nepoužívejte metodu GET, pokud máte heslo nebo jiné citlivé informace k odeslání na server.
  • GET nelze použít k přenosu binárních dat, jako jsou obrázky nebo textové dokumenty, na server.
  • K datům odeslaným metodou GET lze přistupovat pomocí proměnné prostředí QUERY_STRING.
  • PHP poskytuje asociativní pole $_GET pro přístup ke všem odeslaným informacím pomocí metody GET.

if($_GET["jméno"] || $_GET["věk"]) ( echo "Vítejte ". $_GET["jméno"]; echo "Jste ". $_GET["věk"]. " let "; exit(); )

Název: Stáří:

Metoda POST

Metoda POŠTA přenáší informace prostřednictvím HTTP hlaviček. Informace je zakódována tak, jak je popsáno v případě metody DOSTAT a umístí se do záhlaví ŘETĚZEC DOTAZU.

  • Metoda POST nemá žádné omezení na velikost dat, která je třeba odeslat.
  • Metodu POST lze použít k odesílání ASCII i binárních dat.
  • Data odeslaná pomocí metody POST procházejí hlavičkou HTTP, takže zabezpečení závisí na protokolu HTTP. Pomocí zabezpečeného protokolu HTTP můžete zajistit ochranu vašich informací.
  • PHP poskytuje asociativní pole $_POST pro přístup ke všem informacím odeslaným pomocí metody POST.

Vyzkoušejte následující příklad umístěním zdrojového kódu do skriptu test.php.

if($_POST["jméno"] || $_POST["věk"]) ( if (preg_match("[^A-Za-z"-]",$_POST["jméno"])) ( zemřít (" neplatné jméno a jméno musí být alfa"); ) echo "Vítejte ". $_POST["jméno"]; echo "Jste ". $_POST["věk"]. "let."; exit(); )

Název: Stáří:

$_REQUEST proměnná

PHP proměnná $_REQUEST obsahuje obsah jako $_GET, $_POST, tak $_COOKIE. Budeme diskutovat o proměnné $_COOKIE když mluvíme o sušenkách.

Proměnnou PHP $_REQUEST lze načíst výsledek z dat formuláře odeslaných pomocí metod GET a POST.

První metodou, jak provést požadavek PHP POST, je použít file_get_contents . Druhá metoda bude používat fread v kombinaci s několika dalšími funkcemi. Obě možnosti používají funkci stream_context_create k vyplnění požadovaných polí záhlaví požadavku.

Vysvětlení kódu

Proměnná $sPD obsahuje data, která mají být přenesena. Musí být ve formátu řetězce požadavku HTTP, takže některé speciální znaky musí být zakódovány.

Jak ve funkci file_get_contents, tak ve funkci fread máme dva nové parametry. První z nich je use_include_path . Protože provádíme požadavek HTTP, bude v obou příkladech nepravdivý. Když je nastaveno na true pro čtení místního zdroje, funkce bude hledat soubor na adrese include_path .

Druhým parametrem je kontext, který je vyplněn návratovou hodnotou stream_context_create, která přebírá hodnotu pole $aHTTP.

Použití file_get_contents k vytváření požadavků POST

Chcete-li odeslat požadavek POST pomocí file_get_contents v PHP, musíte použít stream_context_create k ručnímu vyplnění polí záhlaví a určení, který "wrapper" se má použít - v tomto případě HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST data $aHTTP = array("http" => // Wrapper, který bude použit array("method" => "POST", // Metoda požadavku // Hlavičky požadavku jsou nastaveny pod "header" => "Content - typ: application/x-www-form-urlencoded", "content" => $sPD)); $kontext = stream_context_create($aHTTP); $obsah = file_get_contents($sURL, false, $kontext); echo $obsah;

Použití fread k provádění požadavků POST

K vytváření požadavků POST můžete použít funkci fread. Následující příklad používá stream_context_create k sestavení nezbytných záhlaví požadavků HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST data $aHTTP = array("http" => // Wrapper, který bude použit array("method" => "POST", // Metoda požadavku // Hlavičky požadavku jsou nastaveny pod "header" => "Content - typ: application/x-www-form-urlencoded", "content" => $sPD)); $kontext = stream_context_create($aHTTP); $handle = fopen($sURL, "r", false, $kontext); $obsah = ""; while (!feof($handle)) ( $contents .= fread($handle, 8192); ) fclose($handle); echo $obsah;

Vytváření požadavků GET pomocí PHP

Nyní se zaměříme na používání fread a file_get_contents ke stahování obsahu z internetu přes HTTP a HTTPS. Chcete-li použít metody popsané v tomto článku, musíte povolit možnost fopen wrappers. Chcete-li to provést, musíte v souboru php.ini nastavit parametr allow_url_fopen na hodnotu On.

Provádění požadavků POST a GET v PHP se používá k přihlášení na webové stránky, načtení obsahu webových stránek nebo ke kontrole nových verzí aplikací. Probereme, jak vytvářet jednoduché požadavky HTTP.

Používání fread ke stahování nebo přijímání souborů přes internet

Pamatujte, že čtení webové stránky je omezeno na přístupnou část paketu. Musíte tedy použít funkci stream_get_contents ( podobně jako file_get_contents) nebo smyčka while pro čtení obsahu po menších kouscích, dokud není dosaženo konce souboru:

V tomto případě zpracování požadavku PHP POST je poslední argument funkce fread roven velikosti fragmentu. Obecně by nemělo být větší než 8192 ( 8*1024 ).

Mějte na paměti, že může být větší nebo menší a také může být omezena nastavením systému, na kterém PHP běží.

Pomocí file_get_contents získáte adresu URL webu

Ještě jednodušší je použít tuto metodu při čtení souboru přes HTTP, protože se nemusíte starat o čtení po kouscích - vše je řešeno v PHP.

Tato publikace je překladem článku „Making POST Requests With PHP“, který připravil přátelský projektový tým

PHP je v současnosti jedním z nejpopulárnějších jazyků pro implementaci webových aplikací. Tento kurz je věnován studiu jeho základů. Důraz je kladen na praktickou aplikaci získaných dovedností.

Jazyk PHP byl vytvořen pro řešení konkrétního praktického problému na internetu (který lze zjistit přečtením první přednášky kurzu). Budeme se také snažit nenechat se příliš rozptylovat teoretickým uvažováním a na každé z přednášek se budeme snažit vyřešit konkrétní problém. Většina příkladů je převzata ze skutečného systému: virtuálního muzea historie informatiky. První část kurzu je věnována studiu základů syntaxe a řídicích struktur. Poté je technologie klient-server považována za hlavní aplikační oblast jazyka PHP. Poté přejdeme ke studiu nejužitečnějších vestavěných funkcí podle našeho názoru a řešení praktických problémů s jejich pomocí. Přestože objektový model v jazyce PHP není nejbohatší, jeho zásadní přítomnost umožňuje přirozeně popisovat objektové datové modely. Za základní model bude považován dokumentový model virtuálního muzea informatiky. Poté bude zvažována řada aplikovaných aspektů: práce se souborovým systémem, s databází, řetězci, relacemi, DOM XML - to vše nám umožní zvážit klíčové úkoly praktického použití jazyka.

Jak je vidět z výše uvedené tabulky, server Apache zaujímá vedoucí pozici. Vše, co kdy řekneme o webových serverech, je zaměřeno na Apache, pokud není uvedeno jinak. O tom, jak jej nainstalovat do počítače, jsme mluvili již na úplně první přednášce. A nyní, jak jsme slíbili, přejděme k protokolu HTTP.

HTTP protokol a způsoby přenosu dat na server

Internet je postaven na vícevrstvém principu, od fyzické vrstvy, která se zabývá fyzickými aspekty přenosu binárních informací, až po aplikační vrstvu, která poskytuje rozhraní mezi uživatelem a sítí.

HTTP (HyperText Transfer Protocol) je protokol aplikační vrstvy určený pro výměnu hypertextových informací na internetu.

HTTP poskytuje sadu metod k určení účelu požadavku odeslaného na server. Tyto metody jsou založeny na referenční disciplíně, kde se Universal Resource Identifier, buď jako Universal Resource Locator (URL) nebo Universal Resource Name, používá k označení zdroje, na který by měla být metoda aplikována. ,URN).

Zprávy přes síť při použití protokolu HTTP jsou přenášeny ve formátu podobném formátu zpráv internetové pošty (RFC-822) nebo formátu zpráv MIME (Multipurpose Internet Mail Exchange).

HTTP se používá pro komunikaci mezi různými uživatelskými programy a programy bran, které poskytují přístup ke stávajícím internetovým protokolům, jako jsou SMTP (Email Protocol), NNTP (News Transfer Protocol), FTP (File Transfer Protocol), Gopher a WAIS. HTTP je navrženo tak, aby umožňovalo takovým branám přenášet data přes proxy servery bez ztráty.

Protokol implementuje princip požadavek/odpověď. Požadující program – klient zahájí interakci s odpovídajícím programem – serverem a odešle požadavek obsahující:

Přístupová metoda;

URI adresa;

Verze protokolu;

Zpráva (formou podobná jako MIME) obsahující informace o typu přenášených dat, informace o klientovi, který požaduje, a případně obsah (tělo) zprávy.

Odpověď serveru obsahuje:

Stavový řádek, který obsahuje verzi protokolu a návratový kód (úspěch nebo chyba);

Zpráva (ve formě MIME), která obsahuje informace o serveru, metainformace (tj. informace o obsahu zprávy) a tělo zprávy.

Protokol neurčuje, kdo by měl otevřít a zavřít spojení mezi klientem a serverem. V praxi spojení obvykle otevře klient a server po odeslání odpovědi iniciuje jeho ukončení.

Podívejme se blíže na formu, ve které jsou požadavky na server odesílány.

Formulář žádosti zákazníka

Klient odešle požadavek na server v jedné ze dvou forem: úplné nebo zkrácené. Žádost v první formě se nazývá úplná žádost a ve druhé formě jednoduchá žádost.

Jednoduchý požadavek obsahuje metodu přístupu a adresu zdroje. Formálně to lze napsat takto:

<Простой-Запрос> := <Метод> <символ пробел>
<Запрашиваемый-URI> <символ новой строки>

Metoda může být GET, POST, HEAD, PUT, DELETE a další. O nejběžnějších z nich si povíme o něco později. Požadovaný URI je nejčastěji URL zdroje.

Příklad jednoduchého požadavku:

ZÍSKEJTE http://phpbook.info/

Zde GET je přístupová metoda, tzn. metoda, která by měla být aplikována na požadovaný zdroj, a http://phpbook.info/ je URL požadovaného zdroje.

Úplný požadavek obsahuje stavový řádek, několik záhlaví (záhlaví požadavku, obecné záhlaví nebo záhlaví obsahu) a případně tělo požadavku. Formálně lze obecnou formu úplné žádosti napsat takto:

<Полный запрос> := <Строка Состояния>
(<Общий заголовок>|<Заголовок запроса>|
<Заголовок содержания>)
<символ новой строки>
[<содержание запроса>]

Hranaté závorky zde označují volitelné prvky záhlaví a alternativní možnosti jsou uvedeny ve svislém pruhu. Živel<Строка состояния>obsahuje metodu požadavku a URI zdroje (stejně jako jednoduchý požadavek) a navíc verzi použitého protokolu HTTP. Chcete-li například zavolat externí program, můžete použít následující stavový řádek:

POST http://phpbook.info/cgi-bin/test HTTP/1.0

V tomto případě se používá metoda POST a HTTP verze 1.0.

V obou formách požadavku hraje důležitou roli URI požadovaného zdroje. Nejběžnější URI se používá ve formě adresy URL zdroje. Při přístupu na server můžete použít jak plnou, tak i zjednodušenou URL.

Úplný formulář obsahuje typ přístupového protokolu, adresu zdroje serveru a adresu zdroje na serveru (obrázek 4.2).

Ve zkrácené formě jsou protokol a adresa serveru vynechány, což značí pouze umístění zdroje z kořenového adresáře serveru. Úplný formulář se použije, pokud je možné požadavek předat na jiný server. Pokud se pracuje pouze s jedním serverem, pak se často používá zkrácená forma.


Rýže. 4.2.Úplný URL formulář

Metody

Jak již bylo zmíněno, jakýkoli požadavek klienta na server musí začínat specifikací metody. Metoda sděluje účel požadavku klienta. Protokol HTTP podporuje poměrně dost metod, ale ve skutečnosti se používají pouze tři: POST, GET a HEAD. Metoda GET vám umožňuje získat jakákoli data identifikovaná pomocí URI v požadavku na zdroj. Pokud URI ukazuje na program, pak je vrácen výsledek činnosti programu, nikoli jeho text (pokud ovšem text není výsledkem jeho činnosti). Další informace potřebné pro zpracování požadavku jsou zabudovány do samotného požadavku (ve stavovém řádku). Při použití metody GET se skutečné požadované informace (například text dokumentu HTML) vrátí do pole těla zdroje.

Existuje variace metody GET - podmíněné GET. Tato metoda říká serveru, že požadavek by měl být zodpovězen pouze v případě, že podmínka obsažená v poli if-Modified-Since v hlavičce požadavku je pravdivá. Přesněji řečeno, tělo zdroje je předáno jako odpověď na požadavek, pokud byl zdroj změněn od data uvedeného v if-Modified-Since.

Metoda HEAD je podobná metodě GET, ale nevrací tělo zdroje a nemá podmíněný protějšek. K získání informací o zdroji se používá metoda HEAD. To se může hodit například při řešení problému testování hypertextových odkazů.

Metoda POST je navržena pro přenos informací na server, jako jsou anotace zdrojů, zprávy a poštovní zprávy, data, která mají být přidána do databáze, tzn. pro přenos velkého objemu a poměrně důležitých informací. Na rozdíl od metod GET a HEAD přenáší POST tělo zdroje, což jsou informace přijaté z polí formuláře nebo jiných vstupních zdrojů.

Doposud jsme pouze teoretizovali a seznamovali se se základními pojmy. Nyní je čas naučit se toto vše využívat v praxi. Později v přednášce se podíváme na to, jak odesílat požadavky na server a jak zpracovávat jeho odpovědi.

Použití formulářů HTML k odeslání dat na server

Jak přenést data na server? Pro tento účel má jazyk HTML speciální konstrukci – formuláře. Formuláře jsou navrženy tak, aby dostávaly informace od uživatele. Například potřebujete znát přihlašovací jméno a heslo uživatele, abyste mohli určit, ke kterým stránkám webu může mít přístup. Nebo potřebujete osobní údaje uživatele, abyste jej mohli kontaktovat. K zadávání takových informací se přesně používají formuláře. Můžete do nich zadat text nebo vybrat vhodné možnosti ze seznamu. Data zapsaná ve formuláři jsou odeslána ke zpracování speciálnímu programu (například PHP skriptu) na serveru. V závislosti na údajích zadaných uživatelem může tento program generovat různé webové stránky, odesílat dotazy do databáze, spouštět různé aplikace atd.

Pojďme pochopit syntaxi formulářů HTML. Mnozí to možná znají, ale přesto si zopakujeme hlavní body, protože je to důležité.

Pro vytvoření formuláře v HTML se tedy používá značka FORM. Uvnitř je jeden nebo více INPUT příkazů. Pomocí atributů akce a metody tagu FORM zadáte název programu, který bude data formuláře zpracovávat, respektive metodu požadavku. Příkaz INPUT určuje typ a různé charakteristiky požadovaných informací. Údaje formuláře jsou odeslány po stisknutí vstupního tlačítka typu odeslání. Vytvořme formulář pro registraci účastníků korespondenční školy programování.

Po zpracování prohlížečem bude tento soubor vypadat asi takto:


Rýže. 4.3. Příklad html formuláře

Takto se vytvářejí a vypadají HTML formuláře. Budeme předpokládat, že jsme se naučili nebo si zapamatovali, jak je vytvořit. Jak vidíme, ve formuláři můžete určit způsob přenosu dat. Podívejme se, co se stane, pokud zadáte metodu GET nebo POST a jaký bude rozdíl.

Pro metodu GET

Při odesílání dat formuláře pomocí metody GET se obsah formuláře připojí k adrese URL za otazník jako dvojice název=hodnota spojené se znakem &:

action?name1=value1&name2=value2&name3=value3

Akce je zde adresa URL programu, který by měl zpracovat formulář (buď program zadaný v atributu action tagu formuláře, nebo samotný aktuální program, pokud je tento atribut vynechán). Názvy název1, název2, název3 odpovídají názvům prvků formuláře a hodnota1, hodnota2, hodnota3 odpovídají hodnotám těchto prvků. Všechny speciální znaky, včetně = a &, budou z těchto jmen nebo hodnot parametrů vynechány. Proto byste tyto symboly a znaky azbuky neměli používat v identifikátorech v názvech nebo hodnotách prvků formuláře.

Pokud do vstupního pole zadáte nějaký servisní znak, bude přenesen ve svém hexadecimálním kódu, například symbol $ bude nahrazen %24. Stejným způsobem se přenášejí i ruská písmena.

U polí pro zadávání textu a hesla (jedná se o vstupní prvky s atributem type=text a type=password) bude hodnota jakákoliv, kterou uživatel zadá. Pokud uživatel do takového pole nic nezadá, pak bude v řetězci dotazu přítomen prvek name=, kde name odpovídá názvu tohoto prvku formuláře.

U zaškrtávacích políček a přepínacích tlačítek je hodnota určena atributem VALUE, když je tlačítko zaškrtnuté. Nezaškrtnutá tlačítka jsou při sestavování řetězce dotazu zcela ignorována. V případě potřeby může mít více tlačítek zaškrtávacích políček stejný atribut NAME (a různé hodnoty). Tlačítka typu radio button jsou určena pro jednu ze všech nabízených možností, a proto musí mít stejný atribut NAME a různé atributy VALUE.

V zásadě není nutné vytvářet HTML formulář pro přenos dat metodou GET. Požadované proměnné a jejich hodnoty můžete jednoduše přidat do řetězce URL.

http://phpbook.info/test.php?id=10&user=pit

V tomto ohledu má přenos dat metodou GET jednu podstatnou nevýhodu – falšovat hodnoty parametrů může každý. Proto nedoporučujeme používat tuto metodu k přístupu na stránky chráněné heslem nebo k přenosu informací, které ovlivňují bezpečnost programu nebo serveru. Navíc byste neměli používat metodu GET k přenosu informací, které uživatel nesmí měnit.

Přes všechny tyto nevýhody je použití metody GET docela pohodlné při ladění skriptů (pak můžete vidět hodnoty a názvy předávaných proměnných) a pro předávání parametrů, které nemají vliv na bezpečnost.

Pro metodu POST

Obsah formuláře je zakódován úplně stejným způsobem jako u metody GET (viz výše), ale místo přidání řetězce do URL je obsah požadavku odeslán jako blok dat v rámci operace POST. Pokud je přítomen atribut ACTION, pak nalezená hodnota URL určuje, kam se má tento blok dat odeslat. Tato metoda, jak již bylo uvedeno, se doporučuje pro přenos velkých bloků dat.

Informace zadané uživatelem a odeslané na server pomocí metody POST jsou podávány na standardním vstupu do programu určeného atributem action, nebo do aktuálního skriptu, pokud je tento atribut vynechán. Délka odesílaného souboru je předána v proměnné prostředí CONTENT_LENGTH a datový typ je předán v proměnné CONTENT_TYPE.

Data můžete odesílat pouze pomocí metody POST pomocí formuláře HTML, protože data se odesílají v těle požadavku a nikoli v záhlaví, jako v GET. V souladu s tím můžete změnit hodnotu parametrů pouze změnou hodnoty zadané ve formuláři. Při použití POST uživatel nevidí data odeslaná na server.

Hlavní výhodou POST požadavků je jejich větší bezpečnost a funkčnost oproti GET požadavkům. Proto se metoda POST častěji používá k přenosu důležitých informací, ale i informací velkého rozsahu. Neměli byste však zcela spoléhat na bezpečnost tohoto mechanismu, protože data požadavku POST lze také zfalšovat, například vytvořením souboru HTML na vašem počítači a jeho vyplněním potřebnými údaji. Navíc ne všichni klienti mohou používat metodu POST, což omezuje její případy použití.

Při odesílání dat na server jakýmkoliv způsobem se přenášejí nejen data zadaná uživatelem, ale také řada proměnných, nazývaných proměnné prostředí, charakterizující klienta, jeho provozní historii, cesty k souborům atd. Zde jsou některé z proměnných prostředí:

REMOTE_ADDR – IP adresa hostitele (počítače), který odesílá požadavek;

REMOTE_HOST – název hostitele, ze kterého byl požadavek odeslán;

HTTP_REFERER – adresa stránky odkazující na aktuální skript;

REQUEST_METHOD – metoda, která byla použita při odeslání požadavku;

QUERY_STRING – informace umístěné v URL za otazníkem;

SCRIPT_NAME – virtuální cesta k programu, který má být spuštěn;

HTTP_USER_AGENT – informace o prohlížeči, který klient používá

Zatím jsme zmínili pouze to, že požadavky klientů jsou zpracovávány na serveru pomocí speciálního programu. Ve skutečnosti si tento program můžeme napsat sami, a to i v PHP, a bude si s přijatými daty dělat, co chceme. Abyste mohli tento program napsat, musíte se seznámit s některými pravidly a nástroji, které PHP pro tento účel nabízí.

V rámci PHP skriptu existuje několik způsobů, jak přistupovat k datům odeslaným klientem přes HTTP. Před PHP 4.1.0 byl přístup k těmto datům prováděn pomocí názvů přenášených proměnných (pamatujte, že data jsou přenášena ve formě dvojic „název proměnné, symbol „=“, hodnota proměnné“). Pokud tedy bylo předáno například first_name=Nina, pak se uvnitř skriptu objevila proměnná $first_name s hodnotou Nina. Pokud bylo nutné rozlišit, jakou metodou byla data přenesena, pak byla použita asociativní pole $HTTP_POST_VARS a $HTTP_GET_VARS, jejichž klíče byly názvy přenášených proměnných a hodnotami byly hodnoty ​těchto proměnných. Pokud je tedy pár first_name=Nina předán metodou GET, pak $HTTP_GET_VARS["first_name"]="Nina".

Není bezpečné používat názvy předávaných proměnných přímo v programu. Proto bylo počínaje PHP 4.1.0 rozhodnuto použít speciální pole – $_REQUEST – pro přístup k proměnným přenášeným prostřednictvím HTTP požadavků. Toto pole obsahuje data přenášená pomocí metod POST a GET a také pomocí HTTP cookies. Jedná se o superglobální asociativní pole, tzn. jeho hodnoty lze získat kdekoli v programu pomocí názvu odpovídající proměnné (prvku formuláře) jako klíče.

Příklad 4.2.Řekněme, že jsme vytvořili formulář pro registraci účastníků do korespondenční školy programování, jako v příkladu výše. Poté do souboru 1.php, který zpracovává tento formulář, můžete napsat následující:

$str = "Dobrý den,
".$_REQUEST["first_name"]."
".$_REQUEST["last_name"]."!
";
$str .="Zvolili jste studium kurzu v
".$_REQUEST["kurs"];
echo $str;
?>

Pokud jsme pak do formuláře zadali jméno „Vasya“, příjmení „Petrov“ a mezi všemi kurzy vybrali kurz PHP, zobrazí se nám na obrazovce prohlížeče tato zpráva:

Dobrý den, Vasyo Petrov!

Po zavedení pole $_REQUEST byla pole $HTTP_POST_VARS a $HTTP_GET_VARS z důvodu konzistence přejmenována na $_POST a $_GET, ale samy o sobě nezmizely z používání z důvodů kompatibility s předchozími verzemi PHP. Na rozdíl od svých předchůdců se pole $_POST a $_GET stala superglobální, tzn. přístupné přímo a uvnitř funkcí a metod.

Uveďme příklad použití těchto polí. Řekněme, že potřebujeme zpracovat formulář obsahující vstupní prvky pojmenované jméno_jmeno, příjmení, kurs (například výše uvedený formulář.html). Data byla přenesena metodou POST a data přenesená jinými metodami nechceme zpracovávat. To lze provést následovně:

$str = "Dobrý den,
".$_POST ["first_name"]."
".$_POST ["last_name"] ."!
";
$str .= "Rozhodli jste se studovat kurz na ".
$_POST["kurs"];
echo $str;
?>

Pokud pak na obrazovce prohlížeče zadáme jméno „Vasya“, příjmení „Petrov“ a mezi všemi kurzy vybereme kurz PHP, zobrazí se nám zpráva jako v předchozím příkladu:

Dobrý den, Vasyo Petrov!
Rozhodli jste se studovat kurz PHP

Aby byla zachována schopnost zpracovávat skripty starší než PHP 4.1.0, byla zavedena direktiva register_globals, která povoluje nebo zakazuje přístup k proměnným přímo jejich jmény. Pokud je parametr register_globals=On v souboru nastavení PHP, pak lze k proměnným předávaným na server pomocí metod GET a POST přistupovat jednoduše pomocí jejich jmen (tj. můžete napsat $first_name). Pokud register_globals=Off, pak musíte napsat $_REQUEST["first_name"] nebo $_POST["first_name"], $_GET["first_name"], $HTTP_POST_VARS["first_name"], $HTTP_GET_VARS["first_name"]. Z bezpečnostního hlediska je lepší tuto direktivu zakázat (tj. register_globals=Off). S povolenou direktivou register_globals budou výše uvedená pole obsahovat také data předaná klientem.

Někdy potřebujete znát hodnotu proměnné prostředí, jako je metoda použitá k odeslání požadavku nebo IP adresa počítače, který požadavek odeslal. Tyto informace můžete získat pomocí funkce getenv(). Vrací hodnotu proměnné prostředí, jejíž název je předán jako parametr.

getenv("POŽADAVKA_METODA");
// vrátí použitou metodu
echo getenv("VZDÁLENÁ_ADDR");
// zobrazí IP adresu uživatele,
// kdo poslal žádost
?>

Jak jsme řekli, pokud se použije metoda GET, pak se data přenesou přidáním řetězce dotazu ve formě párů název_proměnná=hodnota do adresy URL zdroje. Cokoli za otazníkem v URL lze získat pomocí příkazu

getenv("QUERY_STRING");

Díky tomu je možné přenášet data v nějaké jiné podobě metodou GET. Například můžete zadat pouze hodnoty několika parametrů pomocí znaménka plus a ve skriptu můžete analyzovat řetězec dotazu na části nebo můžete předat hodnotu pouze jednoho parametru. V tomto případě se v poli $_GET objeví prázdný prvek s klíčem rovným této hodnotě (celý řetězec dotazu) a znak „+“ nalezený v řetězci dotazu bude nahrazen podtržítkem „_“.

U metody POST jsou data přenášena pouze pomocí formulářů a uživatel (klient) nevidí, jaká data jsou na server odesílána. Aby je viděl, musí hacker nahradit náš formulář svým vlastním. Poté server odešle výsledky zpracování nesprávného formuláře na nesprávné místo. Abyste tomu zabránili, můžete zkontrolovat adresu stránky, ze které byla data odeslána. To lze provést znovu pomocí funkce getenv():

getenv("HTTP_REFERER");

Nyní je čas vyřešit problém formulovaný na začátku přednášky.

Příklad zpracování požadavku pomocí PHP

Připomeňme si, o jaký úkol šlo, a ujasněme si jeho formulaci. Musíte napsat formulář pro registraci účastníků do korespondenční školy programování a po registraci odeslat zprávu účastníkovi. Tuto zprávu jsme nazvali univerzální dopis, ale bude se mírně lišit od dopisu, který jsme složili v předchozí přednášce. Zde také nebudeme nic posílat e-mailem, abychom nebyli jako spammeři, ale jednoduše tuto zprávu vygenerujeme a zobrazíme na obrazovce prohlížeče. První verzi registračního formuláře jsme již poskytli výše. Změníme to tak, aby si každý registrátor mohl vybrat tolik kurzů, kolik chce navštěvovat, a nebudeme potvrzovat přijetí registračního formuláře.

Vše je zde velmi jednoduché a jasné. Jediná věc, kterou je třeba poznamenat, je způsob předávání hodnot prvku checkbox. Když do názvu prvku napíšeme kurs, znamená to, že první zaškrtnutý prvek pole se zapíše do prvního prvku pole kurs, druhý zaškrtnutý zaškrtávací pole se zapíše do druhého prvku pole atd. Prvky zaškrtávacího pole můžete samozřejmě jednoduše pojmenovat jinak, ale to zkomplikuje zpracování dat, pokud existuje mnoho kurzů.

Skript, který toto vše bude analyzovat a zpracovávat, se nazývá 1.php (formulář odkazuje konkrétně na tento soubor, který je zapsán v jeho atributu action). Standardně se pro přenos používá metoda GET, ale zadali jsme POST. Na základě informací přijatých od registrované osoby skript vygeneruje odpovídající zprávu. Pokud si člověk nějaké kurzy vybral, dostane zprávu o čase jejich konání a lektorech, kteří je vyučují. Pokud si člověk nic nevybral, zobrazí se mu zpráva o příštím setkání Korespondenční školy programátorů (ZSH).

HTML formuláře umožňují uživateli zadaná data odeslat na server, kde je lze dále zpracovávat. Údržba formuláře se provádí ve dvou fázích. Formulář musí být nejprve předložen uživateli, který jej vyplní svými údaji a poté jej odešle na server. Každý formulář má vstupní webovou stránku, kterou je nutné načíst, aby bylo možné zpracovat data odeslaná uživatelem. Často se jedná o stejný soubor skriptu, který generuje formulář. V tomto případě kód PHP jednoduše zkontroluje data ve formuláři, aby určil, zda znovu volat skript k vytvoření formuláře, nebo začít zpracovávat přijatá data.

Pozornost! Lekce je zastaralá. Nové lekce na toto téma jsou obsaženy v kurzu PHP pro začátečníky.

Ve většině případů odesílání formulářů na server zahrnuje nějakou práci s databází. Například operace prohledávání databáze je nezbytnou akcí pro nejrůznější aplikace, ať už jde o vyhledávání příspěvků na fóru, uživatelů nebo blogu. V každém případě tato operace může uživateli usnadnit život. Protože V tuto chvíli jsme se ještě neseznámili s interakcí PHP a MySQL DBMS, v tomto článku se podíváme na jednoduché příklady zpracování formulářů a hlavním úkolem pro mě je ukázat, jak se informace přenášejí pomocí jazyka PHP .

Přenos informací pomocí jazyka PHP

Tato část poskytuje základní informace o tom, jak lze přenášet data mezi webovými stránkami. Některé z těchto informací se netýkají výhradně technologie PHP, ale popisují interakci nástrojů PHP a HTML nebo se týkají samotného protokolu HTTP.

Nedostatek státní podpory v protokolu HTTP

Nejdůležitější vlastností jakékoli webové technologie, kterou je třeba mít vždy na paměti, je skutečnost, že samotný protokol HTTP je bezstavový. To znamená, že každý požadavek HTTP (který se ve většině případů rovná požadavku na přijetí a doručení jediného zdroje, jako je stránka HTML, soubor .jpg, šablona stylů atd.) je nezávislý na všech ostatních požadavcích, obsahovat jakékoli - informace o identifikaci klienta a nezanechává stopy v paměti počítače.

I když je web koncipován tak, že navigace, tzn. přechod z jedné stránky na druhou probíhá striktně jedním směrem (řekněme, že stránka 1 vede pouze na stránku 2, která vede pouze na stránku 3 atd.), nástroje pro podporu protokolu HTTP nemají informace a neberou v úvahu, že uživatel Prohlížení stránky 2 musí mít dříve navštívenou stránku 1. Nemůžete přiřadit hodnotu proměnné na stránce 1 a očekávat, že bude importována na stránku 2 pomocí samotného HTML. HTML kód lze použít k zobrazení formuláře a tento kód lze dokonce použít k zadávání informací, ale pokud nejsou použity nějaké další prostředky pro přenos zadaných informací na jinou stránku nebo program, hodnota přiřazená proměnné po přesunutí jednoduše zmizí. na jinou stránku.

Technologie zpracování formulářů, jako je PHP, jsou navrženy tak, aby přesně tento problém vyřešily. PHP vám umožňuje zachytit hodnotu proměnné předávané z předchozí stránky na další a zpřístupnit tuto hodnotu pro pozdější použití. Jak se ukazuje, technologie PHP poskytuje schopnost provádět tyto typy funkcí přenosu dat mimořádně dobře, takže vám umožňuje rychle a snadno nasadit potřebné nástroje pro řešení široké škály problémů spojených se zajištěním fungování webových stránek.

Formuláře HTML poskytují pohodlný způsob, jak předat malý počet hodnot z dané stránky na jakoukoli jinou stránku na webu. Existují i ​​jiné způsoby, jak udržovat stav u mnoha zobrazení stránek, která jsou déle trvající, jako jsou soubory cookie a relace, o kterých se budeme věnovat v budoucím článku. Tento článek se zaměřuje především na nejjednodušší způsoby přenosu informací mezi webovými stránkami, které využívají metody GET a POST v kombinaci s protokolem HTTP k vytváření dynamicky generovaných stránek a zpracování formulářových dat.

GET parametry

Metoda GET předává parametry z předchozí stránky na další jako součást řetězce dotazu, který je reprezentován ve formátu URI Uniform Resource Identifier. Když ke zpracování formuláře použijete metodu GET, po adrese URL identifikované atributem akce formuláře následuje za oddělovačem otazník, za nímž následuje zadaný název (názvy) proměnné a hodnota (hodnoty) a poté je celý řetězec předán zpracovateli (v tomto případě webovému serveru).

Níže je uveden příklad formuláře HTML, který používá metodu GET (zadejte toto označení a uložte soubor jako sportselect.html):

Základy PHP

Vyberte si svůj oblíbený sport

Jakmile uživatel provede svůj výběr a klikne na tlačítko Odeslat, prohlížeč připojí následující prvky v uvedeném pořadí, bez mezer mezi prvky:

  • URL v uvozovkách za slovem akce (http://localhost/sports.php).
  • Otazník (?) označující, že následující znaky tvoří řetězec GET.
  • Název proměnné, rovnítko (=) a odpovídající parametr hodnoty (hodnota=Hokej).
  • Ampersand (&) následovaný dvojicí jméno=hodnota (pokud existuje).

Prohlížeč tedy vygeneruje následující řetězec URL:
http://localhost/sports.php?sport=Hockey

Prohlížeč pak přesměruje výsledný řetězec URL v rámci vlastního adresního prostoru jako nový požadavek. PHP skript níže (sports.php), do kterého je formulář odeslán, načte hodnoty proměnných GET z poslední části řetězce dotazu, vloží tyto proměnné a hodnoty proměnných do superglobálního pole $_GET (má být popsaný krátce) a provede s těmito hodnotami některé nezbytné akce; v tomto případě dojde k vložení do textového řetězce.

Níže je uveden příklad kódu, který ukazuje obslužný program formuláře PHP pro výše uvedený formulář HTML:

Oblíbený sport

Váš oblíbený sport je

Všimněte si, že hodnota zadaná do pole formuláře HTML s atributem name="sport" na předchozí stránce je nyní dostupná jako proměnná PHP s názvem $_GET["sport"]. Následující obrázek ukazuje, jak tento příklad funguje:

Nyní musíme přesně vysvětlit, jak můžete přistupovat k hodnotám předávaným ze stránky na stránku. Tento článek pojednává o dvou hlavních metodách předávání hodnot používaných ve formulářích - GET a POST. Každá metoda má spojené superglobální pole. Superglobální pole jsou podrobněji popsána v článku „Proměnné a konstanty“. Charakteristickým rysem superglobálních polí od jiných polí je přítomnost předpony v názvu ve formě podtržítka.

Formulářový procesor přistupuje ke každému prvku odeslanému pomocí metody GET přístupem k poli $_GET a ke každému prvku odeslanému pomocí metody POST přístupem k poli $_POST. Syntaktická struktura použitá pro přístup k jakémukoli prvku superglobálního pole je jednoduchá a zcela jednotná:

$_array_name["index_name"]

Index_name je zde název části páru název-hodnota (pro metodu GET) nebo název pole formuláře HTML (pro metodu POST). Podle předchozího příkladu $_GET["sport"] specifikuje hodnotu prvku select formuláře s názvem "sport"; tato hodnota byla předána pomocí operace GET provedené na původním souboru. Obsluha formuláře musí používat pole odpovídající metodě, kterou byla data odeslána. Konkrétně v tomto příkladu není hodnota $_POST["sport"] definována, protože původní formulář neodesílal žádná data pomocí metody POST.

Metoda zpracování formuláře GET má oproti metodě POST jednu podstatnou výhodu – ve skutečnosti vám umožňuje pokaždé vygenerovat nový řetězec dotazu URL, odpovídající aktuální situaci. Uživatelé si pak mohou tuto stránku uložit do záložek. Na druhou stranu výsledky odesílání formulářů metodou POST nelze uložit do záložek.

To, že požadované funkčnosti lze dosáhnout pomocí parametrů GET, neznamená, že je nutné použít metodu GET. Nevýhody metody GET, které se vyskytují u většiny typů zpracování formulářů, jsou tak významné. Původní pracovní specifikace HTML 4.0, zveřejněná v roce 1997, tuto metodu nedoporučovala. Hlavní nevýhody metody GET jsou uvedeny níže:

  • Metoda GET není použitelná pro vytváření registračních oken, protože uživatelské jméno a heslo jsou zcela viditelné na obrazovce a je také možné, že tato data jsou uložena v paměti prohlížeče klienta jako informace o navštívené stránce.
  • Každá operace přenosu GET, včetně samotné datové sady, je protokolována na webovém serveru.
  • Metoda GET přiřazuje data proměnné prostředí serveru, takže délka adresy URL je omezená. Možná jste viděli, jak vypadají velmi dlouhé adresy URL, když jsou předávány pomocí metody GET, a skutečně je nepravděpodobné, že by někdo chtěl touto metodou poslat 300slovný kus HTML textu.

Původní HTML specifikace uváděla, že délka řetězce dotazu by neměla přesáhnout 255 znaků. Toto omezení bylo samozřejmě později odstraněno a zůstalo pouze doporučení dodržet limit 255 znaků, ale použití delších řádků může stále způsobovat rušení.

Parametry POST

V současné době je preferovanou metodou odesílání dat formuláře POST (zejména v případech, kdy provádění akcí vede k trvalým změnám, jako je zadávání informací do databáze). Sada dat formuláře je zahrnuta do těla formuláře, když je formulář přesměrován na zpracovatelského agenta (v tomto případě na interpret PHP). Řetězec URL neprochází žádnými viditelnými změnami, které by odrážely rozmanitost přenášených dat.

Mezi vývojáři je rozšířený neopodstatněný názor, že metoda POST je bezpečnější než GET. Ve skutečnosti není žádná metoda více či méně bezpečná než druhá. Návštěvník může prohlížet proměnné a data odeslaná pomocí metody POST stejně dobře jako pomocí metody GET. Jediný rozdíl je v tom, že v prvním případě se přenášená data nenacházejí v adresním řádku. To ale neznamená, že jsou skryté. Data odeslaná metodou POST může uživatel webu prohlížet a upravovat.

První a nejdůležitější pravidlo programování, zejména síťového programování, je toto:
Nikdy nedůvěřujte vstupním datům.

Vždy byste měli předpokládat, že návštěvník mohl úmyslně nebo dokonce náhodně změnit data předávaná konkrétní aplikaci, takže musíte tato data pečlivě zkontrolovat.

Přenášená data formuláře jsou více či méně bezpečná pouze v případě, že je požadavek zabezpečen pomocí SSL, TLS nebo jiné metody šifrování. Data ale stále přicházejí ke koncovému uživateli či návštěvníkovi v přehledné podobě, takže má stále možnost data tak či onak prohlížet a měnit. Faktem je, že protokol SSL jednoduše šifruje data přenášená po síti, což neumožňuje zobrazit data v čistém textu ve fázi jejich přechodu od odesílatele k příjemci. Pokud jde o možnost návštěvníka provádět změny v datech formuláře, protokol SSL neposkytuje nic, co by tomu bránilo.

Chcete-li změnit způsob přenosu dat v předchozím příkladu, musíte provést následující změny:

...

Práce s více hodnotami

Pokud má formulář zaškrtávací políčka nebo přepínače, vyvstává nový problém. Uživatel může například ve formuláři vybrat dvě hodnoty najednou, ale proměnná nemůže uložit více než jednu hodnotu, takže bude nutné použít pole. Tuto situaci demonstruje níže uvedený příklad:

"metoda="post">
Vyberte si své oblíbené mazlíčky

Vybraná zvířata: "; foreach ($animal as $a) ( echo " ".htmlentities($a).""; } } ?>

Tento formulář umožňuje uživateli vybrat si své oblíbené mazlíčky. V tomto příkladu může uživatel vybrat několik zaškrtávacích políček najednou. To znamená, že při zpracování dat formuláře v PHP skriptu je nutné poskytnout možnost přístupu k více hodnotám pomocí jednoho jména. Za název v atributu name jsme umístili pár hranatých závorek (), abychom mohli odeslat více možností jako pole. Pokud by byly hranaté závorky vynechány a uživatel zaškrtl více políček, jejich výběr by byl přepsán posledním zaškrtnutým políčkem. Umístěním hranatých závorek za název jsme naznačili, že hodnoty by měly být uloženy jako pole.

V obslužné rutině je pole uloženo v proměnné $animal a vyčísleno pomocí smyčky foreach, jako běžné pole.

Ověření formuláře a formátování proměnných formuláře

Když aplikace obdrží data od uživatele, musí je pokaždé zkontrolovat na správnost. Pokud nezkontrolujete údaje zadané uživatelem, můžete mít mnoho problémů, včetně bezpečnostních rizik. Provedení prověrky není tak obtížné, jak se může zdát.

Pro uživatele je pohodlnější provést kontrolu na straně klienta pomocí JavaScriptu, ale bez ohledu na to, zda je tato kontrola použita, je nutné provést ověření na straně serveru.

Další věc, kterou je třeba vzít v úvahu při vytváření formulářů HTML, je, že pokud formulář potřebuje zobrazit předvyplněný vstup, musí být nastaven atribut value. Tento bod se týká zejména dvou typů formulářů – formulářů, které se používají k úpravě dat přijatých z databáze, a formulářů, které jsou navrženy tak, aby údaje odeslaly vícekrát. Druhý případ je velmi častý v situacích, kdy je nutné formulář znovu zobrazit po zjištění chyb v již předem vyplněných údajích. Příkladem je registrační formulář, který nepřijímá údaje ke zpracování, dokud uživatel neposkytne platnou e-mailovou adresu nebo jiné požadované údaje.

Níže uvedený příklad ukazuje, jak zpracovat formulář, včetně ověření na straně serveru a zpracování na stejné stránce formuláře:

Základy PHP

"metoda="post">
Kontaktní informace "class="">
"class="">

Tento příklad používá funkci filter_var(), která testuje proměnnou pomocí filtru a přebírá dva parametry – zdrojový řetězec a konstantu udávající typ filtru. Kromě ověřování e-mailových adres (FILTER_VALIDATE_EMAIL) tato funkce podporuje následující konstanty: FILTER_VALIDATE_URL - kontroluje hodnotu správnosti URL (například), FILTER_VALIDATE_IP - kontroluje hodnotu správnosti IP adres, FILTER_VALIDATE_REGEXP - kontroluje hodnotu pro správnost syntaxe regulárního výrazu a několika dalších konstant, které jsou alternativami k funkcím is_bool(), is_float(), is_int() atd.

Tato a následující sekce budou stručně popisovat, jak vytvořit základní webové aplikace pomocí PHP. To, co bylo probráno v této části, zjevně nestačí k tomu, aby vaše aplikace komunikovala s uživatelem a formulovala v závislosti na akcích, které provedl, nebo na parametrech, které zadal. Co chybí? Není dostatek znalostí o tom, jak organizovat vstup uživatelských dat a přenos těchto dat na server. Měli byste již mít základní znalosti o tom, jak programově zpracovávat informace přijaté na serveru.

Metody požadavků HTTP a jejich parametry

Jakákoli dynamická webová aplikace generuje odpověď uživateli v souladu s jím zadanými parametry nebo akcemi provedenými na straně klienta. Kontaktování serveru se nejčastěji skládá ze dvou typů požadavků: pomocí metody GET nebo metody POST. Několik slov o rozdílech mezi těmito dvěma typy žádostí.

GET metoda:

    Parametry se předávají v hlavičce HTTP požadavku, takže jsou viditelné na příkazovém řádku a takový požadavek lze uložit jako záložky. Vzhledem k tomu, že celková délka hlavičky je omezena, je omezen i počet a délka parametrů předávaných pomocí GET.

    Předpokládá se, že výsledky několika identických požadavků GET provedených v řadě by měly být stejné.

Metoda POST:

    Parametry požadavku jsou předávány v těle požadavku HTTP, takže nejsou přítomny na příkazovém řádku. Počet a velikost parametrů je neomezená.

    Předpokládá se, že výsledky více identických požadavků POST mohou vracet různé hodnoty, protože mohou změnit vlastnosti cílového objektu.

Metoda GET by měla být použita pro načtení obsahu informačního zdroje podle parametrů, kdy není potřeba provádět změny v datových strukturách cílového zdroje a má smysl uložit požadavek (URL) do záložek. Metoda GET může být rychlejší než podobné požadavky pomocí metody POST.

Metoda POST by se měla použít, když potřebujete skrýt parametry předané serveru z adresy URL. Tato metoda by měla být také použita v požadavcích na změny obsahu cílového zdroje, přičemž se předává popis těchto změn v parametrech (v těle požadavku).

Cesta ke zdroji?parametr1=hodnota1¶metr2=hodnota2&…

Pokud nemáte speciální HTML formulář pro vyplňování parametrů, můžete odladit chod vaší PHP aplikace předáním testovacích parametrů přímo na příkazovém řádku prohlížeče, například:

Http://site/php-samples/sql.php?sql=select * from d_staff

Pro přístup k parametrům požadavku na straně serveru byste měli použít globální pole $_GET A $_POST respektive. Pokud je vaší aplikaci jedno, jakou metodou k ní přistupuje, měli byste použít pole $_REQUEST, který kombinuje data polí $_GET a $_POST, například takto:

$sql = isset($_REQUEST["sql"]) ? $_REQUEST["sql"] : "";

V tomto příkladu program zjišťuje, zda byl předán parametr „sql“: pokud ano, přiřadí jeho hodnotu odpovídající proměnné, a pokud ne, přiřadí jí prázdnou hodnotu.

Definování parametrů HTTP požadavku pomocí HTML formuláře

Ruční definování parametrů přímo v příkazovém řádku prohlížeče samozřejmě není příliš pohodlné. Tato metoda je vhodná pro programové provádění HTTP požadavků, když spolu webové aplikace komunikují. Chcete-li zadat a provést počáteční ověření dat na straně klienta, měli byste použít formuláře HTML a . Níže je uveden příklad nejjednoduššího formuláře, pomocí kterého se zadává textový parametr (hodnota), který je následně předán serveru jako parametr metody POST.

metoda ="příspěvek" akce =’sql.php’ > SQL:

Atribut method prvku formuláře určuje metodu, která určuje metodu přenosu dat na server (get nebo post). Atribut akce určuje php soubor, která žádost zpracuje. Pokud by měl být obslužnou rutinou aktuální soubor, pak atribut action není nutné přidávat. Pro všechny prvky, jejichž hodnota musí být předána jako parametr požadavku HTTP, musíte definovat jedinečnou hodnotu pro atribut name. Je to hodnota atributu název bude index v polích $_GET, $_POST nebo $_REQUEST (viz příklad výše). Stisknutí tlačítka Předložit odešle formulář se všemi zadanými hodnotami na server.