Imaginární odeslání php. Html formuláře: php formulář - pošlete požadavek na stejnou stránku. Jak se vyhnout potížím s PHP _SELF

Dlouho jsem přemýšlel, jak tento článek nazvat a nic lepšího mě nenapadlo. Toto je jediný titul, který alespoň nějak odráží podstatu řečeného. Abych byl upřímný, nevím, jak se to správně jmenuje, tak jsem článek pojmenoval stejně, jako jsem se snažil najít ve vyhledávači alespoň nějaké informace na toto téma.

Na jednom ze stránek jsem potřeboval použít dvě tlačítka pro odeslání v jednom formuláři, která by odeslala vyplněná data různým PHP „handlerům“ v závislosti na tom, kdy bylo tlačítko stisknuto. Google mi na nic rozumného neodpověděl, zřejmě jsem se jen nezeptal správným způsobem, takže jsem na to musel přijít sám.

Tak jsem to položil k vaší úvaze.

Podstata problému

Po vlastní implementaci jsem stále našel několik řešení, která byla založena na použití běžných tlačítek, ke kterým byl JS přišroubován.

Implementoval jsem svůj plán téměř stejným způsobem, ale použil jsem standardní typ odeslání. Zdá se, že vše funguje a moje řešení je podle mého názoru logicky správnější.

Toto řešení bude fungovat stejně dobře jak na bezplatném hostingu, tak v případě, že zvolíte profesionální hosting. Tato metoda je implementována výhradně na straně klienta a neměla by zpomalovat server.

Aby bylo snazší pochopit, co chci a jak to funguje, zde je skutečně fungující příklad ve formě formuláře, který má 2 odesílání, která odesílají data na různé stránky.

Jednou ze skvělých věcí na PHP je způsob, jakým pracuje s HTML formuláři. Hlavní věc je, že každý formulářový prvek je automaticky dostupný pro vaše PHP programy. Podrobné informace o používání formulářů v PHP naleznete v části. Zde je příklad HTML formuláře:

Příklad č. 1 Nejjednodušší formulář HTML

Tvé jméno:

Tvůj věk:

Na této formě není nic zvláštního. Toto je běžný HTML formulář bez speciálních značek. Když uživatel vyplní formulář a klikne na tlačítko Odeslat, bude vyvolána stránka action.php. Tento soubor může mít něco jako:

Příklad č. 2 Zobrazení dat formuláře

Ahoj, .
Jsi starý.

Příklad výstupu tohoto programu:

Dobrý den, Sergeji. Je vám 30 let.

Pokud neberete v úvahu kousky kódu s htmlspecialchars() a (int), princip fungování tohoto kódu by měl být jednoduchý a srozumitelný. htmlspecialchars() zajišťuje, že „speciální“ znaky HTML jsou správně zakódovány, aby na vaši stránku nebyl vložen škodlivý kód HTML nebo Javascript. Pole věku, o kterém víme, že by mělo být číslo, můžeme jednoduše převést na celé číslo, které se automaticky zbaví nežádoucích znaků. PHP to také umí automaticky pomocí rozšíření filtru. Proměnné $_POST["name"] a $_POST["age"] vám automaticky nastaví PHP. Dříve jsme používali superglobální proměnnou $_SERVER, ale zde také používáme superglobální proměnnou $_POST, která obsahuje všechna POST data. všimněte si, že způsob odesílání(metoda) našeho formuláře je POST. Pokud bychom použili metodu DOSTAT, pak by naše informace z formuláře byly v superglobální proměnné $_GET . Případně můžete použít proměnnou $_REQUEST, pokud na zdroji dat nezáleží. Tato proměnná obsahuje směs dat GET, POST a COOKIE.

před 15 lety

Podle specifikace HTTP byste měli použít metodu POST, když používáte formulář ke změně stavu něčeho na straně serveru. Pokud má například stránka formulář umožňující uživatelům přidávat vlastní komentáře, jako je tento zde, formulář by měl používat POST. Pokud kliknete na "Znovu načíst" nebo "Obnovit" na stránce, na kterou jste se dostali prostřednictvím POST, je to téměř vždy chyba -- neměli byste stejný komentář zveřejňovat dvakrát -- což je důvod, proč tyto stránky nejsou přidány do záložek nebo mezipaměti.

Metodu GET byste měli použít, když váš formulář, no, dostává něco ze serveru a ve skutečnosti nic nemění. Například formulář pro vyhledávač by měl používat GET, protože vyhledávání na webu by nemělo měnit nic, co by klienta mohlo zajímat, a ukládání do záložek nebo ukládání výsledků dotazu vyhledávače do mezipaměti je stejně užitečné jako ukládání do záložek nebo ukládání do mezipaměti. statickou HTML stránku.

Před 2 roky

Stojí za objasnění:

POST není bezpečnější než GET.

Důvody pro volbu GET vs. POST zahrnují různé faktory, jako je záměr požadavku ("odesíláte" informace?), velikost požadavku (existují omezení, jak dlouhá může být URL, a parametry GET jsou odesílány v URL) a jak snadno chcete, aby byla akce sdílena – Příklad: Vyhledávání Google je GET, protože usnadňuje kopírování a sdílení vyhledávacího dotazu s někým jiným pouhým sdílením adresy URL.

Zabezpečení je zde pouze zvažováno kvůli skutečnosti, že GET je snazší sdílet než POST. Příklad: nechcete, aby GET zasílal heslo, protože uživatel může sdílet výslednou URL a nechtěně odhalit své heslo.

GET a POST jsou však stejně snadné zachytit dobře umístěnou záškodní osobou, pokud nenasadíte TLS/SSL k ochraně samotného síťového připojení.

Všechny formuláře odesílané přes HTTP (obvykle port 80) jsou nezabezpečené a dnes (2017) není mnoho dobrých důvodů pro to, aby veřejný web nepoužíval HTTPS (což je v podstatě HTTP + Transport Layer Security).

Jako bonus, pokud používáte TLS, minimalizujete riziko, že vaši uživatelé dostanou kód (AD) do vašeho provozu, který jste tam nevložili vy.

Pro přenos parametrů ze sil se používají především metody POST a GET. Hlavním rozdílem mezi metodami POST a GET je způsob přenosu informací. U metody GET se parametry předávají přes adresní řádek (URL), tzn. v hlavičce HTTP požadavku, zatímco u metody POST jsou parametry přenášeny přes tělo HTTP požadavku a neprojevují se v adresním řádku.

1. Tlačítka - Tag

Tag vytváří tlačítka na webové stránce a jeho akce se podobá výsledku získanému pomocí tagu (s parametrem type="button | reset | submit"). Na rozdíl od tohoto tagu nabízí pokročilé možnosti tvorby tlačítek. Například na takové tlačítko můžete umístit libovolné HTML prvky včetně obrázků. Pomocí stylů můžete definovat vzhled tlačítka změnou písma, barvy pozadí, velikosti a dalších parametrů.

Teoreticky by značka měla být umístěna uvnitř formuláře nastaveného prvkem. Prohlížeče však nezobrazují chybovou zprávu a pracují správně se značkou, pokud na ni narazí samostatně. Pokud však potřebujete odeslat výsledek kliknutí na tlačítko na server, musí být umístěn v kontejneru. Závěrečná značka je povinná.

Možnosti:

zakázáno - blokuje přístup a úpravu prvku.

typ - typ tlačítka

value - Hodnota tlačítka, která bude odeslána na server nebo načtena pomocí spritů.

Tlačítko s textem

Parametr DISABLED Blokuje přístup a úpravu tlačítka. V tomto případě se zobrazí šedě a uživatel jej nemůže aktivovat. Navíc takové tlačítko nemůže získat fokus stisknutím klávesy Tab, pomocí myši nebo jinak. Tento stav tlačítka však lze změnit pomocí skriptů.

Aktivní tlačítko Neaktivní tlačítko

Parametr TYP Určuje typ tlačítka, který nastavuje jeho chování ve formuláři. Jednotlivé typy tlačítek se vzhledově nijak neliší, ale každé tlačítko má své vlastní funkce. Výchozí hodnota: tlačítko.

Argumenty:

tlačítko - běžné tlačítko.

reset - Tlačítko pro vymazání zadaných údajů formuláře a vrácení hodnot do původního stavu.

Odeslat – Tlačítko pro odeslání dat formuláře na server.

Vymazat formulář Odeslat formulář

Parametr VALUE Určuje hodnotu tlačítka, které bude odesláno na server. Na server je odeslána dvojice „název=hodnota“, kde jméno je určeno parametrem name tagu a hodnota je určena parametrem value. Význam se může shodovat s textem na tlačítku nebo být nezávislý. Parametr value se také používá pro přístup k datům prostřednictvím skriptů.

Odeslat formulář

1.1. Tlačítko (typ vstupu=tlačítko) 1.2. Tlačítko s obrázkem (typ vstupu = obrázek) Tlačítko s obrázkem

Tlačítka s obrázky jsou podobná tlačítku Odeslat, ale představují obrázek. Chcete-li to provést, nastavte type=image a src="image.gif" .

Když uživatel klikne kamkoli na obrázek, na server se odešle příslušný formulář se dvěma dalšími proměnnými - sub_x a sub_y . Obsahují souřadnice uživatele, který kliknul na obrázek. Zkušení programátoři si mohou všimnout, že názvy proměnných zaslané prohlížečem ve skutečnosti obsahují tečku spíše než podtržítko, ale PHP tečku automaticky převede na podtržítko.

1.3. Tlačítko odeslání formuláře (typ vstupu=odeslat)

Slouží k odeslání formuláře do skriptu. Při vytváření tlačítka pro odeslání formuláře musíte zadat 2 atributy: type="submit" a value="Button text" . Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.!}

Není potřeba žádný PHP skript.

1.4. Řada tlačítek (odeslat) pro výběr možnosti akce 2. Tlačítko resetování formuláře (Reset)

Když kliknete na tlačítko reset, všechny prvky formuláře se nastaví do stavu, který byl zadán ve výchozích atributech, a formulář nebude odeslán.

Není potřeba žádný PHP skript.

3. Zaškrtávací políčko

Zaškrtávací políčka nabízejí uživateli řadu možností a umožňují libovolný výběr (žádná, jedna nebo více z nich).

Bílý
Zelená
Modrý
Červené
Černá

// první sada tlačítek
// druhá sada tlačítek
// třetí sada tlačítek

5. Textové pole (text)

Při vytváření běžného textového pole o velikosti a maximální povolené délce znaků maxlength přebírá atribut type hodnotu text . Pokud je zadán parametr value, pole zobrazí hodnotu zadanou v proměnné. Při vytváření pole nezapomeňte uvést název pole, protože... tento atribut je povinný.

6. Pole hesla

Úplně stejné jako textové pole, až na to, že znaky zadané uživatelem se na obrazovce nezobrazí.

7. Skryté textové pole (skryté)

Umožňuje předat skriptu některé informace o službě, aniž by se zobrazily na stránce.

8. Rozbalovací seznam (vyberte)

Značka je rozevírací nebo rozbalený seznam a lze vybrat jeden nebo více řádků současně. Hodnota však bude předána poslednímu vybranému tlačítku.

Seznam začíná spárovanými značkami. Tagy umožňují definovat obsah seznamu a parametr value definuje hodnotu řetězce. Pokud je vybraný parametr specifikován v tagu, bude řádek nejprve vybrán. Parametr size určuje, kolik řádků bude seznam zabírat. Pokud je velikost 1 , bude seznam rozbalovací. Pokud je zadán atribut multiple, lze vybrat více prvků ze seznamu. Ale toto schéma se prakticky nepoužívá a s velikostí = 1 to nedává smysl.

Bílá Zelená Modrá Červená Černá

Pokud potřebujete vytvořit rozevírací seznam s předvídatelnou sekvencí. Například seznam s roky 2000 až 2050. Pak se použije následující technika.

9. Víceřádkové pole pro zadávání textu (textová oblast)

Víceřádkové textové vstupní pole umožňuje odeslat nejen jeden řádek, ale několik najednou. V případě potřeby můžete zadat atribut readonly, který zakazuje upravovat, mazat a měnit text, tzn. text bude pouze pro čtení. Pokud je nutné, aby byl text zpočátku zobrazen ve víceřádkovém vstupním poli, musí být umístěn mezi značky.

Je zde parametr zalamování – nastavení zalamování řádků. Možné hodnoty:

vypnuto - deaktivuje zalamování řádků;

virtuals - zobrazí zalomení řádků, ale odešle text tak, jak byl zadán;

fyzické - konce řádků jsou ponechány v původní podobě.

Ve výchozím nastavení značka vytvoří prázdné pole, které je široké 20 znaků a skládá se ze 2 řádků.


Aby víceřádkové textové pole vyhovovalo formátování html (zalomení řádků pomocí značky
nebo
), pak použijte funkci nl2br():

Původně vložený řádek 1 Původně vložený řádek 2 Původně vložený řádek 3

10. Tlačítko pro nahrávání souborů (procházet)

Slouží k implementaci nahrávání souborů na server. Při vytváření textového pole musíte také zadat typ pole jako "soubor" .

Nahrát soubor:

ZPŮSOBY KOMUNIKACE PROHLÍŽEČE SE SERVEREM

Protokol HTTP poskytuje několik metod. To je důležitá informace. Jiné cesty nejsou. V praxi se používají dva: GET je přenos dat v adresním řádku, například když uživatel klikne na odkaz. POST - když klikne na tlačítko ve formuláři.

metoda GET

Pro přenos dat metodou GET není potřeba vytvářet formulář na HTML stránce (nikdo vám nezakazuje používat formuláře pro požadavky metodou GET - to je ale hloupost) - stačí odkaz na dokument s doplněním řetězec dotazu, který může vypadat jako páry proměnná=hodnota, jsou kombinovány pomocí ampersandu & a řetězec je připojen k adrese URL stránky pomocí otazníku „? "

Ale nemusíte používat páry klíč=hodnota, pokud potřebujete předat pouze jednu proměnnou; k tomu musíte za otazník napsat VALUE (ne název) proměnné.

Výhodou předávání parametrů tímto způsobem je, že klienti, kteří nemohou použít metodu POST (například vyhledávače), mohou parametry jednoduše předat skriptu pomocí odkazu a získat obsah.

Nevýhodou je, že pouhou změnou parametrů v adresním řádku může uživatel skript otočit nepředvídatelným způsobem, což vytváří obrovskou bezpečnostní díru v kombinaci s nedefinovanými proměnnými a register_globals nebo by někdo mohl zjistit hodnotu důležité proměnné. (jako ID relace) pouhým pohledem na obrazovku monitoru.

Přístup k veřejným stránkám předáním parametrů (vyšší funkčnost)

Přenos informací, které neovlivňují úroveň zabezpečení

Přístup k chráněným stránkám se zadanými parametry

K přenosu informací ovlivňujících úroveň zabezpečení

Pro přenos informací, které uživatel nemůže upravit (některé přenášejí text SQL dotazů.

Metoda POST

Data můžete odeslat pomocí metody POST pouze pomocí formuláře na stránce HTML. Hlavní rozdíl mezi POST a GET je v tom, že data nejsou přenášena v hlavičce požadavku, ale v těle, takže je uživatel nevidí. Lze jej upravit pouze změnou samotného formuláře.

Výhoda:

Větší zabezpečení a funkčnost pro požadavky pomocí formulářů POST.

Chyba:

Menší dostupnost.

Na co byste jej měli použít:

Přenášet velké množství informací (text, soubory..);

Předávat jakékoli důležité informace;

Chcete-li omezit přístup (například použít pouze formulář pro navigaci – tato možnost není dostupná pro všechny programy robotů nebo chytače obsahu).

Na co se nesmí používat:

Bez omezení.

Nahrávání souborů metodou POST

PHP je schopno přijmout soubor stažený pomocí libovolného prohlížeče. To umožňuje nahrávat textové i binární soubory. V kombinaci s PHP autentizací a funkcemi souborového systému máte plnou kontrolu nad tím, kdo smí nahrávat soubory a co se souborem po nahrání dělat.

Stránku pro nahrání souboru lze implementovat pomocí speciálního formuláře, který vypadá asi takto:

//Formulář pro nahrávání souborů Odeslat tento soubor:

Ve výše uvedeném příkladu je třeba "_URL_" nahradit odkazem na skript PHP. Skryté pole MAX_FILE_SIZE (hodnota musí být zadána v bajtech) musí předcházet poli pro výběr souboru a jeho hodnota je maximální povolená velikost souboru, který má být přijat. Měli byste se také ujistit, že v atributech formuláře zadáte enctype="multipart/form-data", jinak nebudou soubory nahrány na server.

Pozornost

Možnost MAX_FILE_SIZE je doporučení prohlížeče, i když PHP by tuto podmínku také zkontrolovalo. Obejít toto omezení na straně prohlížeče je poměrně snadné, takže byste se neměli spoléhat na tuto funkci při blokování všech větších souborů. Neexistuje však žádný způsob, jak obejít omezení maximální velikosti PHP. Měli byste v každém případě přidat proměnnou ve tvaru MAX_FILE_SIZE, protože to zabrání uživatelům v nervózním čekání při přenosu velkých souborů, jen aby zjistili, že soubor je příliš velký a přenos ve skutečnosti selhal.

Jak definovat metodu požadavku?

Přímo:

Getenv("POŽADAVKA_METODA");

vrátí GET nebo POST.

Jakou metodu použít?

Pokud se formulář používá k vyžádání některých informací, například při vyhledávání, měl by být odeslán metodou GET. Chcete-li stránku aktualizovat, můžete si ji uložit do záložek a nebo poslat odkaz příteli.

Pokud jsou v důsledku odeslání formuláře zaznamenána nebo změněna data na serveru, měla by být odeslána metodou POST a po zpracování formuláře je nutné přesměrovat prohlížeč pomocí metody GET. POST může být také potřeba, pokud je potřeba přenést velké množství dat na server (pro GET je to velmi omezené), a také pokud by se přenesená data neměla zobrazovat v adresním řádku (při zadávání přihlašovacího jména a hesla, například).

V každém případě po zpracování POSTu byste měli prohlížeč vždy přesměrovat na nějakou stránku, byť stejnou, ale bez údajů formuláře, aby se při obnovení stránky znovu nezaznamenaly.

Jak přenést data do jiného souboru přímo z těla PHP programu pomocí metod GET a POST? Příklad demonstrující odesílání dat pomocí metod POST a GET současně a přijímání odpovědi ze serveru.

Tento článek podrobně popisuje použití proměnné PHP _SELF.

Co je to proměnná PHP _SELF?

Proměnná PHP _SELF vrací název a cestu aktuálního souboru (vzhledem ke kořenu dokumentu). Tuto proměnnou můžete použít v atributu akce formuláře. Existují také některé nuance, které byste měli vědět. Tyto nuance samozřejmě nemůžeme ignorovat.

Podívejme se na pár příkladů.

Echo $_SERVER["PHP_SELF"];

1) Předpokládejme, že váš soubor php je umístěn na následující adrese:

http://www.yourserver.com/form-action.php

V tomto případě bude proměnná PHP _SELF obsahovat:

"/form-action.php"

2) Předpokládejme, že váš soubor php je umístěn na této adrese:

Http://www.yourserver.com/dir1/form-action.php

PHP_SELF bude:

"/dir1/form-action.php"

PHP _SELF v atributu akce formuláře. Proč tam byla potřeba?

Typicky se proměnná PHP _SELF používá v atributu action tagu formuláře. Atribut action specifikuje adresu, na kterou bude obsah formuláře odeslán po potvrzení (uživatel klikne na tlačítko s type="submit"). Zpravidla se jedná o stejnou stránku, ze které formulář odešel.

Pokud však přejmenujete soubor, na který formulář odkazuje, budete muset přejmenovat název souboru v atributu action, jinak formulář nebude fungovat.

Proměnná PHP _SELF vás ušetří zbytečných oprav, protože adresa stránky bude generována automaticky na základě názvu souboru.

Řekněme, že máte soubor formuláře nazvaný form-action.php a chcete, aby byl formulář po potvrzení odeslán do stejného souboru. Obvykle píšou takto:

Ale můžete použít PHP proměnnou _SELF místo form-action.php. V tomto případě bude kód vypadat takto: