Képzeletbeli benyújtás php. Html űrlapok: php űrlap - kérés küldése ugyanarra az oldalra. Hogyan kerüljük el a problémákat a PHP _SELF használatával

Sokáig gondolkodtam, hogy milyen címet adjak ennek a cikknek, és nem tudtam jobbat kitalálni. Ez az egyetlen cím, amely legalább valahogy tükrözi az elhangzottak lényegét. Hogy őszinte legyek, nem tudom, hogy hívják helyesen, ezért ugyanúgy elneveztem a cikket, mint ahogy egy keresőben próbáltam legalább némi információt találni ebben a témában.

Az egyik oldalon két beküldő gombot kellett használnom egy űrlapon, amelyek a kitöltött adatokat különböző PHP „kezelőknek” küldték el, attól függően, hogy a gombot megnyomták. A Google nem válaszolt semmi ésszerűt, láthatóan csak nem jól kérdeztem, így magamnak kellett kitalálnom.

Szóval figyelmébe ajánlottam.

A probléma lényege

Miután saját magam implementáltam, mégis több olyan megoldást találtam, amelyek a szokásos gombok használatán alapultak, amelyekhez a JS volt csavarozva.

A tervemet szinte ugyanígy valósítottam meg, de a standard beküldési típust használtam. Úgy tűnik, minden működik, és véleményem szerint az én megoldásom logikusabb.

Ez a megoldás egyformán jól működik ingyenes tárhelyen és akkor is, ha professzionális tárhelyet választ. Ez a módszer teljes egészében a kliens oldalon van megvalósítva, és nem lassíthatja a szervert.

Hogy könnyebben megértsem, mit akarok és hogyan működik, itt van egy igazán működő példa, egy űrlap formájában, amely 2 beküldéssel rendelkezik, amelyek adatokat küldenek különböző oldalakra.

Az egyik nagyszerű dolog a PHP-ben az, ahogyan működik a HTML-űrlapokkal. A lényeg itt az, hogy minden űrlapelem automatikusan elérhetővé váljon a PHP programjai számára. Az űrlapok PHP-ben történő használatával kapcsolatos részletes információkért olvassa el a részt. Íme egy példa HTML űrlapra:

1. példa A legegyszerűbb HTML űrlap

A neved:

A korod:

Ebben a formában nincs semmi különös. Ez egy normál HTML űrlap, különösebb címkék nélkül. Amikor a felhasználó kitölti az űrlapot, és rákattint a küldés gombra, az action.php oldal kerül meghívásra. Ennek a fájlnak valami ilyesmi lehet:

2. példa Űrlapadatok megjelenítése

Helló, .
Öreg vagy.

Példa a program kimenetére:

Helló, Sergey. 30 éves vagy.

Ha nem vesszük figyelembe a kódrészleteket a htmlspecialchars() és (int), ennek a kódnak a működési elvének egyszerűnek és érthetőnek kell lennie. A htmlspecialchars() biztosítja, hogy a "speciális" HTML-karakterek megfelelően legyenek kódolva, így nem illeszthető be rosszindulatú HTML vagy Javascript az oldalába. Az életkor mezőt, amiről tudjuk, hogy számnak kell lennie, egyszerűen egész számmá konvertálhatjuk, ami automatikusan megszabadul a nem kívánt karakterektől. A PHP ezt automatikusan is megteheti a szűrőbővítmény használatával. A $_POST["name"] és a $_POST["age"] változókat a PHP automatikusan beállítja. Korábban a $_SERVER szuperglobális változót használtuk, de itt is a $_POST szuperglobális változót, amely az összes POST adatot tartalmazza. vegye észre, az küldési mód(módszere) a POST. Ha azt a módszert alkalmaztuk KAP, akkor űrlapinformációink a $_GET szuperglobális változóban lennének. Alternatív megoldásként használhatja a $_REQUEST változót, ha az adatforrás nem számít. Ez a változó GET, POST, COOKIE adatok keverékét tartalmazza.

15 évvel ezelőtt

A HTTP-specifikáció szerint a POST módszert kell használnia, amikor az űrlapot használja valami állapotának megváltoztatására a kiszolgáló végén. Például, ha egy oldal rendelkezik egy űrlappal, amely lehetővé teszi a felhasználók számára saját megjegyzések hozzáadását, például Ha az "Újratöltés" vagy a "Frissítés" gombra kattint egy olyan oldalon, amelyet POST-on keresztül ért el, az szinte mindig hiba – nem szabad kétszer elküldenie ugyanazt a megjegyzést – ezért ezek az oldalak nincsenek könyvjelzőként vagy gyorsítótárban tárolva.

A GET metódust akkor kell használnia, ha az űrlapja levesz valamit a szerverről, és valójában nem változtat semmit. Például a keresőmotor űrlapjának a GET-et kell használnia, mivel a webhelyen történő keresés nem változtathat meg semmit, ami az ügyfelet érdekelheti, és a keresőmotor lekérdezésének eredményeinek könyvjelzővel történő elhelyezése vagy gyorsítótárazása ugyanolyan hasznos, mint a könyvjelzők vagy a gyorsítótárazás. egy statikus HTML oldal.

2 évvel ezelőtt

Érdemes tisztázni:

A POST nem biztonságosabb, mint a GET.

A GET vs POST választásának okai különböző tényezőktől függenek, mint például a kérés szándéka (információkat "elküld"?), a kérés mérete (korlátozottak az URL hosszúságára, és a GET paraméterek elküldése az URL-t), és milyen könnyen szeretné megosztani a műveletet -- Például a Google-keresések GET, mert egyszerűvé teszi a keresési lekérdezés másolását és megosztását valaki mással az URL megosztásával.

A biztonság itt csak azért fontos, mert a GET-et könnyebb megosztani, mint a POST-ot. Példa: nem akarja, hogy a GET jelszót küldjön, mert előfordulhat, hogy a felhasználó megosztja a kapott URL-t, és véletlenül felfedheti jelszavát.

Mindazonáltal a GET-et és a POST-ot egyformán könnyen elkaphatja egy jó helyen lévő rosszindulatú személy, ha nem telepíti a TLS/SSL-t magának a hálózati kapcsolatnak a védelme érdekében.

Minden HTTP-n keresztül küldött űrlap (általában a 80-as porton) nem biztonságos, és ma (2017) nincs sok jó oka annak, hogy egy nyilvános webhely ne használja a HTTPS-t (ami alapvetően HTTP + Transport Layer Security).

Bónuszként, ha TLS-t használ, minimálisra csökkenti annak kockázatát, hogy a felhasználók olyan kódokat (AD-okat) fecskendezzenek be a forgalomba, amelyeket nem Ön helyezett el.

A POST és GET metódusokat főként az erők paramétereinek átvitelére használják. A fő különbség a POST és a GET metódusok között az információátvitel módja. A GET metódusban a paraméterek a címsoron (URL) keresztül jutnak el, pl. a HTTP kérés fejlécében, míg a POST metódusban a paraméterek a HTTP kérés törzsén keresztül kerülnek továbbításra, és nem jelennek meg a címsorban.

1. Gombok - Címke

A címke gombokat hoz létre egy weboldalon, és művelete hasonlít a címke használatával kapott eredményre (a type="button | reset | submit" paraméterrel). Ezzel a címkével ellentétben speciális lehetőségeket kínál a gombok létrehozásához. Például egy ilyen gombon bármilyen HTML elemet elhelyezhet, beleértve a képeket is. A stílusok használatával meghatározhatja a gombok megjelenését a betűtípus, a háttérszín, a méret és egyéb paraméterek módosításával.

Elméletileg a címkének az elem által beállított űrlapon belül kell lennie. A böngészők azonban nem jelenítenek meg hibaüzenetet, és megfelelően működnek együtt a címkével, ha önmagában találkozik vele. Ha azonban a gombra kattintás eredményét el kell küldenie a szervernek, akkor azt egy tárolóba kell helyezni. A záró címke kötelező.

Lehetőségek:

letiltva - blokkolja az elem hozzáférését és módosítását.

típus - gombtípus

érték – A kiszolgálónak elküldendő vagy sprit segítségével beolvasott gomb értéke.

Gomb szöveggel

Paraméter DISABLED Letiltja a hozzáférést és a gomb módosítását. Ebben az esetben szürkén jelenik meg, és a felhasználó nem tudja aktiválni. Ezenkívül az ilyen gombok nem tud fókuszálni a Tab billentyű lenyomásával, az egér használatával vagy más módon. Ez a gomb állapota azonban szkripteken keresztül módosítható.

Aktív gomb Inaktív gomb

Paraméter TÍPUS Megadja a gomb típusát, amely beállítja a viselkedését az űrlapon. A különböző típusú gombok megjelenésükben semmiben sem különböznek egymástól, de mindegyik gombnak megvan a maga funkciója. Alapértelmezett érték: gomb.

Érvek:

gomb - Normál gomb.

reset - Gomb a bevitt űrlapadatok törlésére és az értékek eredeti állapotba való visszaállítására.

Küldés – Az űrlapadatok szerverre küldésére szolgáló gomb.

Űrlap törlése Űrlap beküldése

Paraméter VALUE Megadja a kiszolgálónak elküldendő gomb értékét. Egy “name=value” pár kerül elküldésre a szervernek, ahol a nevet a címke name paramétere adja meg, az értéket pedig a value paraméter adja meg. A jelentése vagy egybeeshet a gombon lévő szöveggel, vagy független is lehet. Az érték paramétert az adatok szkripteken keresztüli elérésére is használják.

Nyomtatvány beküldése

1.1. Gomb (bemenet típusa=gomb) 1.2. Képet tartalmazó gomb (bemeneti típus = kép) Képes gomb

A képeket tartalmazó gombok működésükben hasonlóak a Küldés gombhoz, de egy képet ábrázolnak. Ehhez állítsa be a type=image és az src="image.gif" paramétereket.

Amikor a felhasználó a kép bármely pontjára kattint, a megfelelő űrlapot elküldi a szervernek két további változóval - sub_x és sub_y . A képre kattintó felhasználó koordinátáit tartalmazzák. A tapasztalt programozók észrevehetik, hogy a böngésző által küldött változónevek valójában egy pontot tartalmaznak, nem pedig aláhúzást, de a PHP a pontot automatikusan aláhúzássá alakítja.

1.3. Űrlapküldés gomb (bevitel típusa=beküldés)

Az űrlap beküldésére szolgál a forgatókönyvbe. Amikor létrehoz egy gombot egy űrlap elküldéséhez, 2 attribútumot kell megadnia: type="submit" és value="Button text" . Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.!}

Nincs szükség PHP szkriptre.

1.4. Gombok tömbje (beküldés) a 2. műveleti lehetőség kiválasztásához. Űrlap visszaállítása gomb (Visszaállítás)

Amikor a visszaállítás gombra kattint, az összes űrlapelem az alapértelmezett attribútumokban megadott állapotba kerül, és az űrlap nem kerül elküldésre.

Nincs szükség PHP szkriptre.

3. Jelölőnégyzet

A jelölőnégyzetek számos lehetőséget kínálnak a felhasználónak, és tetszőleges kiválasztást tesznek lehetővé (egyet sem, egyet vagy többet).

fehér
Zöld
Kék
Piros
Fekete

// az első gombkészlet
// második gombkészlet
// harmadik gombkészlet

5. Szövegmező (szöveg)

Normál méretű szövegmező létrehozásakor a maximális megengedett maximális hosszúságú karakterhosszúság, a type attribútum a text értéket veszi fel. Ha az érték paraméter meg van adva, a mezőben a változóban megadott érték jelenik meg. A mező létrehozásakor ne felejtse el megadni a mező nevét, mert... ez az attribútum kötelező.

6. Jelszó mező

Pontosan ugyanaz, mint egy szövegmező, csak a felhasználó által beírt karakterek nem jelennek meg a képernyőn.

7. Rejtett szövegmező (rejtett)

Lehetővé teszi bizonyos szolgáltatási információk átadását a szkriptnek anélkül, hogy megjelenítené az oldalon.

8. Legördülő lista (kiválasztás)

A címke egy legördülő vagy kibontott lista, és egy vagy több sor is kiválasztható egyszerre. De az érték az utoljára kiválasztott gombhoz kerül átadásra.

A lista a párosított címkékkel kezdődik. A címkék lehetővé teszik a lista tartalmának meghatározását, az érték paraméter pedig a karakterlánc értékét. Ha a kiválasztott paraméter meg van adva a címkében, akkor először a sor kerül kiválasztásra. A méret paraméter határozza meg, hogy a lista hány sort foglaljon el. Ha a méret 1 , akkor a lista egy legördülő menü lesz. Ha a többszörös attribútum meg van adva, akkor a listából több elem is kiválasztható. De ezt a sémát gyakorlatilag nem használják, és a méret = 1 esetén nincs értelme.

Fehér Zöld Kék Piros Fekete

Ha létre kell hoznia egy előre látható sorrendet tartalmazó legördülő listát. Például egy lista 2000-től 2050-ig tartó éveket. Ekkor a következő technikát alkalmazzuk.

9. Többsoros szövegbeviteli mező (textarea)

A többsoros szövegbeviteli mező lehetővé teszi, hogy ne csak egy sort, hanem egyszerre több sort is küldjön. Szükség esetén megadható az readonly attribútum, amely tiltja a szöveg szerkesztését, törlését, megváltoztatását, pl. a szöveg csak olvasható lesz. Ha szükséges, hogy a szöveg kezdetben többsoros beviteli mezőben jelenjen meg, akkor azt a címkék közé kell helyezni.

Van egy burkolási paraméter - a sorburkolt beállítás. Lehetséges értékek:

off - letiltja a sor tördelését;

virtuals – sortöréseket jelenít meg, de úgy küldi el a szöveget, ahogyan beírta;

fizikai - a sortörések eredeti formájukban maradnak.

Alapértelmezés szerint a címke egy üres mezőt hoz létre, amely 20 karakter széles és 2 sorból áll.


Annak érdekében, hogy a többsoros szövegmező megfeleljen a html formázásnak (sortördelés a címkével
vagy
), majd használja az nl2br() függvényt:

Eredetileg beszúrt 1. sor Eredetileg beszúrt 2. sor Eredetileg beszúrt 3. sor

10. Fájlok feltöltésének gombja (böngészés)

A fájlok szerverre való feltöltésének megvalósítására szolgál. Szövegmező létrehozásakor a mező típusát is meg kell adni "fájl"-ként.

Fájl feltöltés:

A BÖNGÉSZŐ KOMMUNIKÁLÁSÁNAK MÓDJAI A SZERVERVEL

A HTTP protokoll kevés módszert biztosít. Ez fontos információ. Nincs más mód. A gyakorlatban kettőt használnak: GET az, amikor adatátvitel történik a címsorban, például amikor a felhasználó rákattint egy hivatkozásra. POST – amikor rákattint egy gombra az űrlapon.

GET módszer

A GET metódussal történő adatátvitelhez nem kell űrlapot létrehozni egy HTML oldalon (senki sem tiltja, hogy űrlapokat használjon a GET módszerrel történő kéréshez - de ez hülyeség) - elég egy hivatkozás a dokumentumra, kiegészítve egy változó=érték párokat kombinálnak egy & jellel, és a karakterláncot egy kérdőjellel fűzik az oldal URL-jéhez. "

De nem kell kulcs=érték párokat használnia, ha csak egy változót kell átadnia; ehhez a változó ÉRTÉKÉT (nem a nevét) kell a kérdőjel mögé írni.

A paraméterek ilyen módon történő átadásának az az előnye, hogy azok az ügyfelek, amelyek nem tudják használni a POST módszert (például keresőmotorok), a hivatkozás követésével továbbra is egyszerűen átadhatják a paramétereket a szkriptnek, és megkaphatják a tartalmat.

Hátránya, hogy pusztán a címsor paramétereinek megváltoztatásával a felhasználó kiszámíthatatlan módon megfordíthatja a szkriptet, ami hatalmas biztonsági rést hoz létre, ha definiálatlan változókkal és a register_globals bekapcsolásával kombinálják, vagy valaki megtudhatja egy fontos változó értékét. (mint a munkamenet azonosítója) csak a monitor képernyőjére nézve.

Nyilvános oldalak elérése paraméterek átadásával (megnövelt funkcionalitás)

A biztonsági szintet nem befolyásoló információk továbbítása

Védett oldalak elérése átadott paraméterekkel

A biztonsági szintet befolyásoló információk továbbítására

Olyan információk továbbítására, amelyeket a felhasználó nem módosíthat (egyesek SQL lekérdezések szövegét továbbítják.

POST módszer

A POST módszerrel csak egy HTML oldalon lévő űrlap használatával küldhet be adatokat. A fő különbség a POST és a GET között, hogy az adatok nem a kérés fejlécében, hanem a törzsben kerülnek továbbításra, ezért a felhasználó nem látja. Csak az űrlap megváltoztatásával módosítható.

Előny:

Nagyobb biztonság és funkcionalitás a POST űrlapokat használó kérésekhez.

Hiba:

Kevesebb elérhetőség.

Mire érdemes használni:

Nagy mennyiségű információ (szöveg, fájlok) továbbítására;

Bármilyen fontos információ továbbítására;

A hozzáférés korlátozása (például csak az űrlapot használja a navigációhoz – ez a lehetőség nem érhető el minden robotprogram vagy tartalommegragadó számára).

Mire nem szabad használni:

Korlátozások nélkül.

Fájlok feltöltése POST módszerrel

A PHP bármilyen böngészővel letöltött fájlt képes elfogadni. Ez lehetővé teszi szöveges és bináris fájlok feltöltését is. A PHP hitelesítéssel és a fájlrendszer funkcióival kombinálva teljes mértékben szabályozhatja, hogy ki tölthet fel fájlokat, és mit tegyen a fájllal a feltöltést követően.

A fájl feltöltési oldal egy speciális űrlap segítségével valósítható meg, amely valahogy így néz ki:

//Űrlap fájlok feltöltéséhez Fájl küldése:

A fenti példában a "_URL_"-t a PHP-szkriptre mutató hivatkozásra kell cserélni. A MAX_FILE_SIZE rejtett mezőnek (az értéket bájtban kell megadni) meg kell előznie a fájlkiválasztó mezőt, értéke pedig a megengedett maximális fájlméret. Arra is ügyeljen, hogy az űrlapattribútumokban az enctype="multipart/form-data" értéket adja meg, különben a fájlok nem töltődnek fel a szerverre.

Figyelem

A MAX_FILE_SIZE beállítás böngészőajánlat, még akkor is, ha a PHP is ellenőrzi ezt a feltételt. Ezt a korlátozást a böngésző oldalon meglehetősen könnyű megkerülni, ezért ne hagyatkozzon erre a funkcióra az összes nagyobb fájl blokkolásához. A PHP maximális méretkorlátozását azonban nem lehet megkerülni. Mindenképpen érdemes egy MAX_FILE_SIZE formátumú változót hozzáadni, mivel ez megakadályozza, hogy a felhasználók szorongva várjanak hatalmas fájlok átvitele közben, és kiderüljön, hogy a fájl túl nagy, és az átvitel valóban meghiúsult.

Hogyan határozzunk meg egy kérési módot?

Közvetlenül:

Getenv("REQUEST_METHOD");

visszaküldi a GET vagy POST.

Melyik módszert kell alkalmazni?

Ha az űrlapot valamilyen információ kérésére használják, például keresés során, akkor azt a GET módszerrel kell elküldeni. Az oldal frissítéséhez felveheti a könyvjelzők közé, és elküldheti a linket egy barátjának.

Ha egy űrlap beküldése következtében adat rögzítésre vagy módosulásra kerül a szerveren, akkor azt POST módszerrel kell elküldeni, és az űrlap feldolgozása után feltétlenül át kell irányítani a böngészőt GET módszerrel. A POST-ra akkor is szükség lehet, ha nagy mennyiségű adatot kell átvinni a szerverre (a GET esetében ez nagyon korlátozott), és akkor is, ha az átvitt adatok nem jelennek meg a címsorban (bejelentkezési név és jelszó megadásakor, például).

Mindenesetre a POST feldolgozása után mindig át kell irányítani a böngészőt valamelyik oldalra, akár ugyanarra, de az űrlapadatok nélkül, hogy az oldal frissítésekor ne kerüljön rögzítésre újra.

Hogyan vihetünk át adatokat közvetlenül egy másik fájlba egy PHP program törzséből GET és POST metódusokkal? Példa az adatok POST és GET metódusokkal történő egyidejű küldésének és a szervertől való válasz fogadásának bemutatására.

Ez a cikk részletesen bemutatja a PHP _SELF változó használatát.

Mi a PHP _SELF változó?

A PHP _SELF változó az aktuális fájl nevét és elérési útját adja vissza (a dokumentum gyökéréhez viszonyítva). Ezt a változót az űrlap action attribútumában használhatja. Vannak olyan árnyalatok is, amelyeket tudnia kell. Természetesen nem hagyhatjuk figyelmen kívül ezeket az árnyalatokat.

Nézzünk néhány példát.

Echo $_SERVER["PHP_SELF"];

1) Tegyük fel, hogy a php fájlod a következő címen található:

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

Ebben az esetben a PHP _SELF változó a következőket tartalmazza:

"/form-action.php"

2) Tegyük fel, hogy a php fájl ezen a címen található:

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

PHP_SELF lesz:

"/dir1/form-action.php"

PHP _SELF az űrlap művelet attribútumában. Miért volt rá szükség oda?

Általában a PHP _SELF változót a form címke action attribútumában használják. Az action attribútum azt a címet adja meg, amelyre az űrlap tartalma a megerősítést követően (a felhasználó a type="submit" gombbal kattint). Általános szabály, hogy ez ugyanaz az oldal, ahonnan az űrlap elhagyta.

Ha azonban átnevezi az űrlap által hivatkozott fájlt, akkor át kell neveznie a fájlnevet az action attribútumban, különben az űrlap nem fog működni.

A PHP _SELF változó megóvja Önt a szükségtelen javításoktól, mivel az oldal címe a fájlnév alapján automatikusan generálódik.

Tegyük fel, hogy van egy form-action.php nevű űrlapfájlja, és azt szeretné, hogy az űrlapot ugyanabba a fájlba küldje el a megerősítés után. Általában így írnak:

De használhatja a PHP _SELF változót a form-action.php helyett. Ebben az esetben a kód így fog kinézni: