Imaginárne odošlite php. Html formuláre: php formulár - pošlite požiadavku na rovnakú stránku. Ako sa vyhnúť problémom s PHP _SELF

Dlho som rozmýšľal nad tým, aký názov dať tomuto článku a nič lepšie som nevymyslel. Toto je jediný titul, ktorý aspoň ako-tak odráža podstatu uvedeného. Aby som bol úprimný, neviem, ako sa to správne volá, preto som článok nazval rovnako, ako som sa snažil nájsť aspoň nejaké informácie na túto tému vo vyhľadávači.

Na jednej zo stránok som potreboval použiť dve tlačidlá na odoslanie v jednom formulári, ktoré by odoslali vyplnené údaje rôznym PHP „handlerom“ v závislosti od toho, kedy bolo tlačidlo stlačené. Google mi neodpovedal na nič rozumné, zrejme som sa len nespýtal správnym spôsobom, takže som na to musel prísť sám.

Tak som ti to dal na zváženie.

Podstata problému

Po vlastnej implementácii som ešte našiel niekoľko riešení, ktoré boli založené na použití bežných tlačidiel, na ktoré bol JS priskrutkovaný.

Implementoval som svoj plán takmer rovnakým spôsobom, ale použil som štandardný typ odoslania. Zdá sa, že všetko funguje a moje riešenie je podľa mňa logicky správnejšie.

Toto riešenie bude fungovať rovnako dobre ako na bezplatnom hostingu, tak aj v prípade, že si vyberiete profesionálny hosting. Táto metóda je implementovaná výlučne na strane klienta a nemala by spomaľovať server.

Aby ste ľahšie pochopili, čo chcem a ako to funguje, tu je skutočne fungujúci príklad vo forme formulára, ktorý má 2 odosielania, ktoré odosielajú údaje na rôzne stránky.

Jednou zo skvelých vecí na PHP je spôsob, akým pracuje s HTML formulármi. Hlavná vec je, že každý prvok formulára sa automaticky sprístupní vašim programom PHP. Podrobné informácie o používaní formulárov v PHP nájdete v časti. Tu je príklad HTML formulára:

Príklad č. 1 Najjednoduchší HTML formulár

Tvoje meno:

Tvoj vek:

Na tejto forme nie je nič zvláštne. Toto je bežný HTML formulár bez špeciálnych značiek. Keď používateľ vyplní formulár a klikne na tlačidlo Odoslať, zavolá sa stránka action.php. Tento súbor môže mať niečo ako:

Príklad č. 2 Zobrazenie údajov formulára

Ahoj, .
Si starý.

Príklad výstupu tohto programu:

Dobrý deň, Sergey. Máte 30 rokov.

Ak neberiete do úvahy kúsky kódu s htmlspecialchars() a (int), princíp fungovania tohto kódu by mal byť jednoduchý a zrozumiteľný. htmlspecialchars() zaisťuje, že „špeciálne“ znaky HTML sú správne zakódované, aby sa na vašu stránku nevložil škodlivý kód HTML alebo Javascript. Vekové pole, o ktorom vieme, že by malo byť číslo, môžeme jednoducho previesť na celé číslo, čím sa automaticky zbavíme nechcených znakov. PHP to môže urobiť aj automaticky pomocou rozšírenia filtra. Premenné $_POST["name"] a $_POST["age"] za vás automaticky nastaví PHP. Predtým sme používali superglobálnu premennú $_SERVER, ale tu používame aj superglobálnu premennú $_POST, ktorá obsahuje všetky POST dáta. Všimni si spôsob odoslania(metóda) nášho formulára je POST. Ak by sme použili metódu GET, potom by naše informácie z formulára boli v superglobálnej premennej $_GET . Prípadne môžete použiť premennú $_REQUEST, ak na zdroji údajov nezáleží. Táto premenná obsahuje zmes údajov GET, POST a COOKIE.

pred 15 rokmi

Podľa špecifikácie HTTP by ste mali použiť metódu POST, keď používate formulár na zmenu stavu niečoho na strane servera. Ak má napríklad stránka formulár umožňujúci používateľom pridávať vlastné komentáre, ako je tento tu, formulár by mal používať POST. Ak kliknete na "Znova načítať" alebo "Obnoviť" na stránke, na ktorú ste sa dostali prostredníctvom POST, takmer vždy ide o chybu -- nemali by ste ten istý komentár uverejňovať dvakrát -- čo je dôvod, prečo tieto stránky nie sú uložené ako záložky ani vo vyrovnávacej pamäti.

Metódu GET by ste mali použiť vtedy, keď váš formulár dostáva niečo zo servera a v skutočnosti nič nemení. Napríklad formulár pre vyhľadávací nástroj by mal používať GET, pretože vyhľadávanie na webovej lokalite by nemalo meniť nič, čo by klienta mohlo zaujímať, a ukladanie výsledkov dotazu vyhľadávacieho nástroja do medzipamäte je rovnako užitočné ako vytváranie záložiek alebo ukladanie do vyrovnávacej pamäte. statická HTML stránka.

pred 2 rokmi

Stojí za to objasniť:

POST nie je bezpečnejšie ako GET.

Dôvody pre výber GET verzus POST zahŕňajú rôzne faktory, ako je zámer požiadavky ("odosielate" informácie?), veľkosť požiadavky (existujú limity na to, ako dlho môže byť URL, a parametre GET sa odosielajú v adresu URL) a ako jednoducho chcete akciu zdieľať – napríklad vyhľadávanie Google je GET, pretože uľahčuje kopírovanie a zdieľanie vyhľadávacieho dopytu s niekým iným jednoduchým zdieľaním adresy URL.

Bezpečnosť sa tu berie do úvahy len kvôli skutočnosti, že GET je jednoduchšie zdieľať ako POST. Príklad: nechcete, aby GET posielal heslo, pretože používateľ môže zdieľať výslednú adresu URL a neúmyselne odhaliť svoje heslo.

GET a POST však rovnako ľahko zachytí škodoradostná osoba, ak nenasadíte TLS/SSL na ochranu samotného sieťového pripojenia.

Všetky formuláre odoslané cez HTTP (zvyčajne port 80) sú nezabezpečené a dnes (2017) nie je veľa dobrých dôvodov na to, aby verejná webová stránka nepoužívala HTTPS (čo je v podstate HTTP + Transport Layer Security).

Ako bonus, ak používate TLS, minimalizujete riziko, že vaši používatelia dostanú kód (AD) do vašej návštevnosti, ktorý ste tam nevložili vy.

Na prenos parametrov zo síl sa používajú najmä metódy POST a GET. Hlavným rozdielom medzi metódami POST a GET je spôsob prenosu informácií. Pri metóde GET sa parametre prenášajú cez adresný riadok (URL), t.j. v hlavičke HTTP požiadavky, kým pri metóde POST sa parametre prenášajú cez telo HTTP požiadavky a neprejavia sa v adresnom riadku.

1. Tlačidlá - Tag

Značka vytvára tlačidlá na webovej stránke a jej činnosť sa podobá výsledku získanému pomocou značky (s parametrom type="button | reset | submit"). Na rozdiel od tohto tagu ponúka pokročilé možnosti tvorby tlačidiel. Napríklad na takéto tlačidlo môžete umiestniť ľubovoľné prvky HTML vrátane obrázkov. Pomocou štýlov môžete definovať vzhľad tlačidla zmenou písma, farby pozadia, veľkosti a ďalších parametrov.

Teoreticky by sa značka mala nachádzať vo formulári nastavenom prvkom. Prehliadače však nezobrazujú chybové hlásenie a fungujú správne so značkou, ak sa s ňou stretne samostatne. Ak však potrebujete odoslať výsledok kliknutia na tlačidlo na server, musíte ho umiestniť do kontajnera. Vyžaduje sa záverečná značka.

Možnosti:

vypnuté - blokuje prístup a úpravu prvku.

typ - typ tlačidla

hodnota – Hodnota tlačidla, ktorá bude odoslaná na server alebo načítaná pomocou spritov.

Tlačidlo s textom

Parameter DISABLED Blokuje prístup a úpravu tlačidla. V tomto prípade je zobrazená sivá a používateľ ju nemôže aktivovať. Okrem toho takéto tlačidlo nemôže získať zameranie stlačením klávesu Tab, použitím myši alebo iným spôsobom. Tento stav tlačidla je však možné zmeniť pomocou skriptov.

Aktívne tlačidlo Neaktívne tlačidlo

Parameter TYPE Určuje typ tlačidla, ktorý nastavuje jeho správanie vo formulári. Jednotlivé typy tlačidiel sa vzhľadovo nijako nelíšia, no každé tlačidlo má svoje funkcie. Predvolená hodnota: tlačidlo.

Argumenty:

tlačidlo - bežné tlačidlo.

reset - Tlačidlo na vymazanie zadaných údajov formulára a vrátenie hodnôt do pôvodného stavu.

Odoslať – tlačidlo na odoslanie údajov formulára na server.

Vymazať formulár Odoslať formulár

Parameter VALUE Určuje hodnotu tlačidla, ktoré bude odoslané na server. Na server sa odošle pár „meno=hodnota“, kde je názov špecifikovaný parametrom name značky a hodnota je špecifikovaná parametrom value. Význam sa môže zhodovať s textom na tlačidle alebo môže byť nezávislý. Parameter value sa používa aj na prístup k údajom prostredníctvom skriptov.

Odoslať formulár

1.1. Tlačidlo (typ vstupu=tlačidlo) 1.2. Tlačidlo s obrázkom (typ vstupu=obrázok) Tlačidlo s obrázkom

Tlačidlá s obrázkami sú podobné ako tlačidlo Odoslať, ale predstavujú obrázok. Ak to chcete urobiť, nastavte type=image a src="image.gif" .

Keď používateľ klikne kdekoľvek na obrázok, na server sa odošle príslušný formulár s dvoma ďalšími premennými - sub_x a sub_y . Obsahujú súradnice používateľa, ktorý klikol na obrázok. Skúsení programátori si môžu všimnúť, že názvy premenných odosielané prehliadačom v skutočnosti obsahujú bodku namiesto podčiarknutia, ale PHP bodku automaticky prevedie na podčiarkovník.

1.3. Tlačidlo na odoslanie formulára (typ vstupu = odoslať)

Slúži na odoslanie formulára do skriptu. Pri vytváraní tlačidla na odoslanie formulára musíte zadať 2 atribúty: type="submit" a value="Button text" . Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.!}

Nevyžaduje sa žiadny PHP skript.

1.4. Súbor tlačidiel (odoslať) na výber možnosti akcie 2. Tlačidlo resetovania formulára (Reset)

Keď kliknete na tlačidlo reset, všetky prvky formulára sa nastavia do stavu, ktorý bol zadaný v predvolených atribútoch, a formulár sa neodošle.

Nevyžaduje sa žiadny PHP skript.

3. Začiarkavacie políčko

Začiarkavacie políčka ponúkajú používateľovi množstvo možností a umožňujú ľubovoľný výber (žiadnu, jednu alebo viacero).

biely
zelená
Modrá
Červená
čierna

// prvá skupina tlačidiel
// druhá sada tlačidiel
// tretia sada tlačidiel

5. Textové pole (text)

Pri vytváraní bežného textového poľa s veľkosťou a maximálnou povolenou dĺžkou znakov maxlength atribút type preberá hodnotu text . Ak je zadaný parameter value, pole zobrazí hodnotu zadanú v premennej. Pri vytváraní poľa nezabudnite uviesť názov poľa, pretože... tento atribút je povinný.

6. Pole pre heslo

Presne to isté ako textové pole, až na to, že znaky zadané používateľom sa na obrazovke nezobrazia.

7. Skryté textové pole (skryté)

Umožňuje vám odovzdať niektoré informácie o službe do skriptu bez toho, aby sa zobrazili na stránke.

8. Rozbaľovací zoznam (vyberte)

Značka je rozbaľovací alebo rozbalený zoznam, pričom je možné vybrať jeden alebo viac riadkov súčasne. Hodnota sa však prenesie na posledné zvolené tlačidlo.

Zoznam začína spárovanými značkami. Tagy vám umožňujú definovať obsah zoznamu a parameter value definuje hodnotu reťazca. Ak je vybraný parameter špecifikovaný v značke, riadok sa najprv vyberie. Parameter size určuje, koľko riadkov bude zoznam zaberať. Ak je veľkosť 1 , zoznam bude rozbaľovací. Ak je zadaný atribút multiple, potom je možné vybrať viacero prvkov zo zoznamu. Ale táto schéma sa prakticky nepoužíva a s veľkosťou = 1 nemá zmysel.

Biela Zelená Modrá Červená Čierna

Ak potrebujete vytvoriť rozbaľovaciu ponuku s predvídateľnou sekvenciou. Napríklad zoznam s rokmi 2000 až 2050. Potom sa použije nasledujúca technika.

9. Viacriadkové pole na zadávanie textu (textová oblasť)

Viacriadkové pole na zadávanie textu vám umožňuje odoslať nielen jeden riadok, ale niekoľko riadkov naraz. V prípade potreby môžete zadať atribút readonly, ktorý zakazuje upravovať, mazať a meniť text, t.j. text bude len na čítanie. Ak je potrebné, aby bol text na začiatku zobrazený vo viacriadkovom vstupnom poli, musí byť umiestnený medzi značky.

Je tu parameter zalamovania – nastavenie zalamovania riadkov. Možné hodnoty:

vypnuté - deaktivuje zalamovanie riadkov;

virtuals - zobrazuje konce riadkov, ale posiela text tak, ako bol zadaný;

fyzické - zalomenia riadkov sú ponechané v pôvodnej podobe.

V predvolenom nastavení značka vytvára prázdne pole, ktoré má šírku 20 znakov a pozostáva z 2 riadkov.


Aby viacriadkové textové pole vyhovovalo formátovaniu html (zalomenie riadkov pomocou značky
alebo
), potom použite funkciu nl2br():

Pôvodne vložený riadok 1 Pôvodne vložený riadok 2 Pôvodne vložený riadok 3

10. Tlačidlo na nahrávanie súborov (prehliadanie)

Slúži na implementáciu nahrávania súborov na server. Pri vytváraní textového poľa musíte tiež zadať typ poľa ako "súbor" .

Nahrajte súbor:

SPÔSOBY KOMUNIKÁCIE PREHLIADAČA SO SERVEROM

Protokol HTTP poskytuje niekoľko metód. Toto je dôležitá informácia. Neexistujú žiadne iné spôsoby. V praxi sa používajú dva: GET je, keď sa dáta prenesú do panela s adresou, napríklad keď používateľ klikne na odkaz. POST - keď klikne na tlačidlo vo formulári.

GET metóda

Na prenos údajov metódou GET nepotrebujete vytvárať formulár na HTML stránke (nikto vám nezakazuje používať formuláre pre požiadavky metódou GET - to je ale hlúposť) - stačí odkaz na dokument s doplnením reťazec dopytu, ktorý môže vyzerať ako páry premenná=hodnota, sa skombinujú pomocou znaku & a reťazec sa pripojí k adrese URL stránky pomocou otáznika „? "

Ak však potrebujete zadať iba jednu premennú, nemusíte používať páry kľúč=hodnota; na to musíte za otáznik napísať HODNOTU (nie názov) premennej.

Výhodou odovzdávania parametrov týmto spôsobom je, že klienti, ktorí nemôžu použiť metódu POST (napríklad vyhľadávače), môžu aj tak jednoducho odovzdať parametre skriptu pomocou odkazu a získať obsah.

Nevýhodou je, že jednoduchou zmenou parametrov v paneli s adresou môže používateľ otočiť skript nepredvídateľným spôsobom, čo vytvára obrovskú bezpečnostnú dieru v kombinácii s nedefinovanými premennými a register_globals alebo by niekto mohol zistiť hodnotu dôležitej premennej. (ako ID relácie) len pohľadom na obrazovku monitora.

Prístup k verejným stránkam zadaním parametrov (zvýšená funkčnosť)

Prenos informácií, ktoré neovplyvňujú úroveň zabezpečenia

Prístup k chráneným stránkam so zadanými parametrami

Na prenos informácií ovplyvňujúcich úroveň zabezpečenia

Na prenos informácií, ktoré nemôže používateľ zmeniť (niektoré prenášajú text SQL dotazov.

metóda POST

Údaje môžete odoslať metódou POST iba pomocou formulára na stránke HTML. Hlavný rozdiel medzi POST a GET je v tom, že údaje sa neprenášajú v hlavičke požiadavky, ale v tele, takže ich používateľ nevidí. Dá sa upraviť len zmenou samotného formulára.

Výhoda:

Väčšia bezpečnosť a funkčnosť pre požiadavky pomocou formulárov POST.

Chyba:

Menšia dostupnosť.

Na čo by ste ho mali použiť:

Prenášať veľké množstvo informácií (text, súbory...);

Na prenos akýchkoľvek dôležitých informácií;

Na obmedzenie prístupu (napríklad použite iba formulár na navigáciu – možnosť, ktorá nie je dostupná pre všetky programy robotov alebo zachytávače obsahu).

Na čo sa nesmie používať:

Bez obmedzení.

Nahrávanie súborov pomocou metódy POST

PHP je schopné prijať súbor stiahnutý pomocou akéhokoľvek prehliadača. To umožňuje nahrávať textové aj binárne súbory. V kombinácii s PHP autentifikáciou a funkciami súborového systému máte plnú kontrolu nad tým, kto môže nahrávať súbory a čo robiť so súborom po jeho nahraní.

Stránka nahrávania súboru môže byť implementovaná pomocou špeciálneho formulára, ktorý vyzerá asi takto:

//Formulár na nahrávanie súborov Odoslať tento súbor:

Vo vyššie uvedenom príklade je potrebné nahradiť "_URL_" odkazom na skript PHP. Skryté pole MAX_FILE_SIZE (hodnota musí byť špecifikovaná v bajtoch) musí predchádzať poľu na výber súboru a jeho hodnota je maximálna povolená veľkosť súboru, ktorá sa má akceptovať. Mali by ste sa tiež uistiť, že ste v atribútoch formulára zadali enctype="multipart/form-data", inak sa súbory nenahrajú na server.

Pozornosť

Možnosť MAX_FILE_SIZE je odporúčaním prehliadača, aj keď PHP by túto podmienku tiež skontrolovalo. Obídenie tohto obmedzenia na strane prehliadača je pomerne jednoduché, takže by ste sa nemali spoliehať na túto funkciu pri blokovaní všetkých väčších súborov. Neexistuje však spôsob, ako obísť obmedzenie maximálnej veľkosti PHP. V každom prípade by ste mali pridať premennú v tvare MAX_FILE_SIZE, pretože bráni používateľom netrpezlivo čakať pri prenose veľkých súborov, len aby zistili, že súbor je príliš veľký a prenos v skutočnosti zlyhal.

Ako definovať metódu žiadosti?

Priamo:

Getenv("POŽIADAVKA_METÓDA");

vráti GET alebo POST.

Ktorá metóda by sa mala použiť?

Ak sa formulár používa na vyžiadanie niektorých informácií, napríklad počas vyhľadávania, potom by sa mal odoslať pomocou metódy GET. Ak chcete stránku aktualizovať, môžete si ju uložiť ako záložku alebo poslať odkaz priateľovi.

Ak sú v dôsledku odoslania formulára zaznamenané alebo zmenené údaje na serveri, mali by byť odoslané pomocou metódy POST a po spracovaní formulára je nevyhnutné presmerovať prehliadač pomocou metódy GET. POST môže byť potrebný aj vtedy, ak je potrebné preniesť na server veľké množstvo údajov (pre GET je to veľmi obmedzené), a tiež ak sa prenesené údaje nemajú zobrazovať v paneli s adresou (pri zadávaní prihlasovacieho mena a hesla, napríklad).

V každom prípade po spracovaní POSTu by ste mali prehliadač vždy presmerovať na nejakú stránku, hoci aj tú istú, ale bez údajov formulára, aby sa pri obnovení stránky znova nezaznamenali.

Ako preniesť dáta do iného súboru priamo z tela PHP programu pomocou metód GET a POST? Príklad, ktorý demonštruje súčasné odosielanie údajov pomocou metód POST a GET a prijímanie odpovede zo servera.

Tento článok podrobne popisuje používanie premennej PHP _SELF.

Čo je to premenná PHP _SELF?

Premenná PHP _SELF vracia názov a cestu aktuálneho súboru (vzhľadom na koreň dokumentu). Túto premennú môžete použiť v atribúte akcie formulára. Existujú aj niektoré nuansy, ktoré by ste mali vedieť. Samozrejme, nemôžeme ignorovať tieto nuansy.

Pozrime sa na pár príkladov.

Echo $_SERVER["PHP_SELF"];

1) Predpokladajme, že váš súbor php sa nachádza na nasledujúcej adrese:

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

V tomto prípade bude premenná PHP _SELF obsahovať:

"/form-action.php"

2) Predpokladajme, že váš súbor php sa nachádza na tejto adrese:

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

PHP_SELF bude:

"/dir1/form-action.php"

PHP _SELF v atribúte action formulára. Prečo ju tam potrebovali?

Typicky sa premenná PHP _SELF používa v atribúte action značky formulára. Atribút action určuje adresu, na ktorú sa po potvrdení odošle obsah formulára (používateľ klikne na tlačidlo s type="submit"). Spravidla ide o tú istú stránku, z ktorej formulár odišiel.

Ak však premenujete súbor, na ktorý formulár odkazuje, budete musieť premenovať názov súboru v atribúte action, inak formulár nebude fungovať.

Premenná PHP _SELF vás ušetrí od zbytočných opráv, keďže adresa stránky sa vygeneruje automaticky na základe názvu súboru.

Povedzme, že máte súbor formulára s názvom form-action.php a chcete, aby bol formulár po potvrdení odoslaný do rovnakého súboru. Zvyčajne píšu takto:

Namiesto premennej form-action.php však môžete použiť premennú PHP _SELF. V tomto prípade bude kód vyzerať takto: