Formulier voor het verzenden van gegevens in PHP (POST, GET). HTML-formulieren. Methoden voor het verzenden van gegevens naar de server met behulp van een formulier

Het gebruik van GET- en POST-methoden in PHP is moeilijk te overschatten, aangezien deze methoden op vrijwel elke website te vinden zijn. Voordat u het hieronder beschreven materiaal bestudeert, raad ik u aan vertrouwd te raken met de html-tag

. Laten we elk van deze methoden in detail bekijken.

GET-methode

De GET-methode gebruikt een URL-string om gegevens over te dragen. Het is je misschien opgevallen dat er lange en onduidelijke URL's zijn. Bijvoorbeeld: function.php?login=Alex&email=dezyakin. In dit geval worden de gegevens verwerkt in function.php. Na het vraagteken "?" staat een lijst met doorgegeven parameters (parameters worden gescheiden door "&") met waarden: de login-parameter krijgt de waarde Alex toegewezen en de e-mailvariabele krijgt de waarde dezyakin. De gegevens worden opgeslagen in de superglobal array $_GET. Hieronder vindt u een voorbeeld van het gebruik van de GET-methode:

Log in: E-mail: Met behulp van de superglobal array $_GET geven we de geaccepteerde waarden weer:*/echo "
login = ". $_GET["inloggen"] ; echo "
email = ". $_GET["e-mail"] ; ?>

Merk op hoe we waarden uit de $_GET superglobal array lezen: $_GET["variabele_naam"]. In ons voorbeeld zijn de namen van de variabelen gedeclareerd in de vorm (naam=login en naam=e-mail).

Advies:
Voordat ik de ontvangen waarden verwerkt, raad ik u aan om via functies te controleren of ze bestaan isset(variabelenaam) of leeg(variabele_naam)- deze functies zijn besproken in de vorige les 2: variabelen in PHP. Bijvoorbeeld:

controleren op bestaan ​​met behulp van isset: if isset ($_GET["inloggen"] ) ( operators voor het afhandelen van inloggen ... } //of controleer op bestaan ​​met leeg: indien leeg ($_GET["email"] ) ( operators voor e-mailverwerking ... } ?>

In het formulier kunt u de naam opgeven van het bestand dat de overgedragen waarden zal verwerken. Dit gebeurt met behulp van het actieattribuut van het formulier, waaraan het adres van dit bestand kan worden toegewezen. Standaard wordt dit bestand toegewezen aan het huidige bestand (dat wil zeggen, het wordt verwerkt in het bestand waarin het formulier zich bevindt). Hier is een voorbeeld waarin gegevens uit een formulier worden overgebracht naar het bestand srcipt.php voor verwerking:

Log in: E-mail:

Het script.php-bestand moet een soort informatiehandler bevatten, anders wordt de informatie leeg doorgegeven.

De GET-methode heeft veel nadelen:

  • De gebruiker ziet de waarden van de doorgegeven parameters;
  • De gebruiker kan de doorgegeven parameters gemakkelijk vervalsen;
  • Onhandige overdracht van binaire informatie (u moet deze in tekstformaat coderen);
  • Het volume van de overgedragen gegevens is beperkt: 8 KB;

Vanwege de bovengenoemde nadelen wordt de GET-methode alleen gebruikt in gevallen waarin een kleine hoeveelheid gegevens moet worden overgedragen, en deze gegevens zijn op geen enkele manier geclassificeerd.

POST-methode

De POST-methode verschilt van GET doordat de gegevens in privévorm worden overgedragen. Er is een superglobal array $_POST waaruit gegevens als volgt kunnen worden gelezen: $_POST["variabele_naam"]. Bijvoorbeeld:

Log in: "> E-mail: ">
Met behulp van de superglobal array $_POST geven we de geaccepteerde waarden weer:*/echo "
login = ". $_POST["inloggen"] ; echo "
email = ". $_POST["e-mail"] ; ?>

Het resultaat van het uitvoeren van de bovenstaande code wordt weergegeven in de onderstaande afbeelding:

Zoals u kunt zien, heeft de URL geen postscript, maar toch zijn de gegevens ontvangen en weergegeven.

Opmerking:
1) Het volume van de waarden die via de POST-methode worden overgedragen, is standaard beperkt en is gelijk aan 8 MB. Om deze waarde te verhogen moet je de post_max_size richtlijn in php.ini wijzigen.

2) In eerdere versies van PHP werden in plaats van de korte superglobal array-namen $_GET en $_POST langere namen gebruikt: $HTTP_GET_VARS en $HTTP_POST_VARS . Standaard zijn ze uitgeschakeld in PHP 5, maar je kunt ze inschakelen in het php.ini-configuratiebestand met behulp van de parameter register_long_arrays. In de php 6-versie zijn deze lange namen niet beschikbaar.

3) Voordat u variabelen uit $_POST verwerkt, raad ik u aan de variabelen op hun aanwezigheid te controleren, net zoals bij de GET-methode is gedaan.

HTML-formulieren. $_POST- en $_GET-arrays

HTML-formulieren. Methoden voor het verzenden van gegevens naar de server

U bent waarschijnlijk al HTML-formulieren tegengekomen:

Vul uw naam in:

Door deze code op te slaan in een HTML-bestand en deze te bekijken met uw favoriete browser, ziet u een bekend HTML-formulier:

Vul uw naam in:

Label

, met een gepaarde eindtag
, stelt feitelijk het formulier in. De attributen zijn beide optioneel:

  • actie - specificeert de URL (volledig of relatief) waarnaar het formulier wordt verzonden. Als dit kenmerk niet is opgegeven, sturen de meeste browsers (meer precies, alle bij mij bekende browsers) het formulier naar het huidige document, dat wil zeggen 'naar zichzelf'. Dit is een handige afkorting, maar volgens de HTML-standaard is het action-attribuut vereist.
  • methode - methode voor het indienen van het formulier. Er zijn er twee.
    • GET - formuliergegevens verzenden in de adresbalk.
      Mogelijk hebt u op verschillende websites de aanwezigheid van een "?" aan het einde van de URL opgemerkt. en de volgende gegevens in het formaat parameter=waarde. Hier komt de "parameter" overeen met de waarde van het name-attribuut van de formulierelementen (zie hieronder over de tag ), en 'waarde' is de inhoud van het waarde-attribuut (het bevat bijvoorbeeld de invoer van de gebruiker in het tekstveld van dezelfde tag ).
      Probeer bijvoorbeeld iets te zoeken in Yandex en let op de adresbalk van de browser. Dit is de GET-methode.
    • POST - formuliergegevens worden verzonden in de hoofdtekst van het verzoek. Als het niet helemaal duidelijk (of helemaal onduidelijk) is wat dit is, hoeft u zich geen zorgen te maken. We komen binnenkort op dit onderwerp terug.
    Als het method-attribuut niet is gespecificeerd, wordt uitgegaan van GET.

Label - specificeert een vormelement gedefinieerd door het type attribuut:

  • De waarde "tekst" specificeert een tekstinvoerveld van één regel
  • De waarde "verzenden" specificeert een knop die, wanneer erop wordt geklikt, het formulier naar de server verzendt

Andere waarden zijn mogelijk (en (niet de enige tag die een formulierelement specificeert).

Dus wat gebeurt er als we op "OK" klikken?

  1. De browser kijkt naar de elementen in het formulier en construeert formuliergegevens op basis van hun naam en waarde-attributen. Laten we zeggen dat de naam Vasya is ingevoerd. In dit geval zijn de formuliergegevens naam=Vasya&okbutton=OK
  2. De browser brengt een verbinding tot stand met de server en stuurt een verzoek naar de server voor het document dat is opgegeven in het actiekenmerk van de tag
    , met behulp van de gegevensverzendmethode die is opgegeven in het method-attribuut (in dit geval - GET), waarbij de formuliergegevens in het verzoek worden doorgegeven.
  3. De server analyseert het ontvangen verzoek, genereert een reactie, stuurt deze naar de browser en verbreekt de verbinding
  4. De browser geeft het document weer dat is ontvangen van de server

Hetzelfde verzoek handmatig verzenden (via telnet) ziet er als volgt uit (ervan uitgaande dat de domeinnaam van de site www.example.com is):

Telnet www.example.com 80 GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n Host: www.example.com\r\n \r\n

Zoals u waarschijnlijk al geraden heeft, is het klikken op de knop Verzenden op een formulier met de verzendmethode "GET" hetzelfde als het typen van de overeenkomstige URL (met een vraagteken en formuliergegevens aan het einde) in de adresbalk van de browser:

Http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK

In feite wordt de GET-methode gebruikt wanneer u een document opvraagt ​​bij de server door simpelweg de URL in te voeren of op een link te klikken. Gebruik makend van , wordt de URL eenvoudigweg toegevoegd met een vraagteken en formuliergegevens.

Misschien lijken al deze technische details en oefeningen met telnet je ongelooflijk saai en zelfs onnodig (“wat heeft PHP ermee te maken?”). Maar tevergeefs. :) Dit zijn de basisprincipes van het werken met het HTTP-protocol, die elke webprogrammeur uit zijn hoofd moet kennen, en dit is geen theoretische kennis - dit alles zal in de praktijk nuttig zijn.

Laten we nu de eerste regel van ons formulier vervangen door het volgende:

We hebben de verzendmethode opgegeven als "POST". In dit geval worden de gegevens op een iets andere manier naar de server verzonden:

Telnet www.example.com 80 POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n Host: www.example.com\r\n Inhoudstype: application/x-www-form-urlencoded\r\ n Inhoudslengte: 41263\r\n \r\n naam=Vasya&okbutton=OK

Bij gebruik van de POST-methode worden de formuliergegevens verzonden na “twee Enters” - in de hoofdtekst van het verzoek. Alles hierboven is eigenlijk de verzoekheader (en toen we de GET-methode gebruikten, werden de formuliergegevens in de header verzonden). Om ervoor te zorgen dat de server weet bij welke byte hij moet stoppen met het lezen van de hoofdtekst van het verzoek, bevat de header de regel Content-Length; dat de formuliergegevens worden verzonden in de vorm parameter1=value1¶meter2=value2... en dat de waarden worden verzonden in de vorm van urlencode - dat wil zeggen precies hetzelfde als het gebruik van de GET-methode, maar dan in de hoofdtekst van de request - de Content-header informeert de server -Type: application/x-www-form-urlencoded .

Het voordeel van de POST-methode is dat er geen limiet is aan de lengte van de formuliergegevensregel.

Wanneer u de POST-methode gebruikt, is het niet mogelijk om het formulier te verzenden door eenvoudigweg "een link te volgen" zoals u dat met GET zou kunnen doen.

Wanneer u een POST-formulier gebruikt, kunt u in het action-attribuut na het vraagteken de parameters van het GET-formulier opgeven. De POST-methode omvat dus de GET-methode.

$_GET- en $_POST-arrays

Formulieren zijn dus de belangrijkste manier om gegevens uit te wisselen tussen een webserver en een browser, dat wil zeggen dat ze gebruikersinteractie bieden - in feite waar webprogrammering voor is.

Laten we een eenvoudig voorbeeld bekijken:



if ($_SERVER [ "REQUEST_METHOD" ] == "POST" ) (
echo "

Hallo, " . $_POST [ "naam" ] . "

!" ;
}
?>
">
Vul uw naam in:






Het formulier op de regels 8-12 bevat twee elementen: naam en okknop. Het method-attribuut specificeert de POST-methode voor het indienen van formulieren, terwijl het action-attribuut de URL specificeert waarnaar het formulier wordt verzonden, en is gevuld met de waarde van de PHP_SELF-servervariabele - het adres van het script dat momenteel wordt uitgevoerd.

- verkorte vorm voor .

Stel dat we de waarde Vasya in het naamveld hebben ingevoerd en op de knop OK hebben geklikt. In dit geval stuurt de browser een POST-verzoek naar de server. Verzoektekst: naam=Vasya&okbutton=OK . PHP vult automatisch de $_POST array in:

$_POST ["naam" ] = "Vasya"
$_POST ["okknop" ] = "OK"

In werkelijkheid wordt de waarde "Vasya" door de browser verzonden in urlencode-vorm; voor Windows-1251-codering ziet deze waarde eruit als %C2%E0%F1%FF . Maar omdat PHP automatisch de noodzakelijke decodering afhandelt, kunnen we deze functie "vergeten" - totdat we HTTP-verzoeken handmatig moeten afhandelen.

Omdat de hoofdtekst van het verzoek alleen namen en waarden specificeert, maar geen typen formulierelementen, heeft PHP geen idee of $_POST["naam"] overeenkomt met een invoerreeks, een knop of een keuzelijst. Maar over het algemeen hebben we deze informatie helemaal niet nodig. :)

Omdat we niet hoeven te weten wat de verzendknop zegt, kunnen we het naamattribuut op regel 11 verwijderen, waardoor de knopbeschrijving wordt ingekort tot . In dit geval verzendt de browser een POST-verzoek naam=Vasya.

En nu hetzelfde, maar dan voor het GET-formulier:



if (isset($_GET [ "naam" ])) (
echo "

Hallo, " . $_GET [ "naam" ] . "

!" ;
}
?>
">
Vul uw naam in:







Op regel 8 zou je net zo gemakkelijk kunnen schrijven

: GET is de standaardmethode. Deze keer verzendt de browser een GET-verzoek, wat overeenkomt met het invoeren van het adres in de adresbalk: http://site-address/script-name.php?name=Vasya.

PHP doet hetzelfde met GET-formulieren als met POST, met het verschil dat de $_GET-array is gevuld.

Het belangrijkste verschil zit in regel 4. Omdat het simpelweg invoeren van het adres in de browserregel een GET-verzoek is, is de controle of ($_SERVER["REQUEST_METHOD"] == "GET") zinloos. Daarom nemen we onze toevlucht tot de isset()-constructie, die true retourneert als de variabele is gedefinieerd (dat wil zeggen: er is een waarde aan toegewezen), en false als de variabele niet is gedefinieerd. Als het formulier is ingevuld, zoals u al heeft begrepen, kent PHP $_GET["naam"] automatisch de juiste waarde toe.

De verificatiemethode die isset() gebruikt, is universeel; deze kan ook worden gebruikt voor een POST-formulier. Bovendien heeft het de voorkeur omdat u zo kunt zien welke formuliervelden zijn ingevuld.

Een iets complexer voorbeeld.




echo "Voer een naam in!
" ;
< 1900 || $_POST [ "year" ] > 2004 ) {
echo
"
;
) anders (

" ;

echo "Voor jou". $leeftijd. "jaren
" ;
}
echo "


" ;
}
?>
">
Vul uw naam in:


Vul uw geboortejaar in:







Er worden hier geen nieuwe technieken gebruikt. Zoek het uit, voer de code uit, probeer het aan te passen...

Laten we het laatste voorbeeld wijzigen, zodat de gebruiker de velden niet opnieuw hoeft in te vullen. Om dit te doen, vult u de waardekenmerken van de formulierelementen met de waarden die we zojuist hebben ingevoerd.



$name = isset($_POST ["naam"]) ? $_POST ["naam"]: "";
$year = isset($_POST [ "jaar" ]) ? $_POST ["jaar"]: "";

If (isset($_POST [ "naam" ], $_POST [ "jaar" ])) (
if ($_POST [ "naam" ] == "" ) (
echo "Voer een naam in!
" ;
) else if ($_POST [ "jaar" ]< 1900 || $_POST [ "year" ] > 2004 ) {
echo "Geef het geboortejaar op! Geldig waardenbereik: 1900..2004
"
;
) anders (
echo 'Hallo'. $_POST ["naam"] . "!
" ;
$leeftijd = 2004 - $_POST [ "jaar" ];
echo "Voor jou". $leeftijd. "jaren
" ;
}
echo "


" ;
}
?>
">
Vul uw naam in:


Vul uw geboortejaar in:







Regels 4 en 5 kunnen enigszins verwarrend zijn. Alles is heel eenvoudig: regel 4 zou als volgt kunnen worden geschreven:

if (isset($_POST ["naam"]))
$naam = $_POST ["naam"];
anders
$naam = "" ;

De vraag kan rijzen: waarom gooi je de regels 4-5 niet weg en schrijf je:

Vul uw naam in: ">

Vul uw geboortejaar in: ">

Het punt is dat als deze POST-variabelen niet zijn gedefinieerd - en dit zal het geval zijn als het formulier nog niet is ingevuld - PHP waarschuwingen zal geven over het gebruik van niet-geïnitialiseerde variabelen (en, redelijkerwijs: met zo'n bericht kun je vindt snel moeilijk te detecteren typefouten in namen van variabelen, en waarschuwt ook voor mogelijke “gaten” op de site). Je kunt de isset-code natuurlijk rechtstreeks in het formulier plaatsen, maar dat zal te omslachtig zijn.

Begrepen? Probeer nu de fout in de gegeven code te vinden. Nou ja, niet bepaald een vergissing, maar een fout.

htmlspecialchars()

Niet gevonden? Ik zal je een hint geven. Voer bijvoorbeeld in het veld "naam" een dubbel aanhalingsteken in en wat tekst, bijvoorbeeld "Va". Verzend het formulier en bekijk de broncode van de resulterende pagina. De vierde regel zal ongeveer zo zijn:

Vul uw naam in:

Dat wil zeggen, niets goeds. Wat als een sluwe gebruiker JavaScript-code invoert?

Om dit probleem op te lossen, moet je de functie htmlspecialchars() gebruiken, die de speciale tekens vervangt door hun HTML-weergave (bijvoorbeeld een aanhalingsteken met "):



$name = isset($_POST ["naam"]) ? htmlspecialchars ($_POST ["naam"]) : "" ;
$year = isset($_POST [ "jaar" ]) ? htmlspecialchars ($_POST ["jaar"]) : "" ;

If (isset($_POST [ "naam" ], $_POST [ "jaar" ])) (
if ($_POST [ "naam" ] == "" ) (
echo "Voer een naam in!
" ;
) else if ($_POST [ "jaar" ]< 1900 || $_POST [ "year" ] > 2004 ) {
echo "Geef het geboortejaar op! Geldig waardenbereik: 1900..2004
"
;
) anders (
echo 'Hallo'. $naam. "!
" ;
$leeftijd = 2004 - $_POST [ "jaar" ];
echo "Voor jou". $leeftijd. "jaren
" ;
}
echo "


" ;
}
?>
">
Vul uw naam in:


Vul uw geboortejaar in:







Herhaal het experiment en zorg ervoor dat de HTML-code nu correct is.

Onthoud: de functie htmlspecialchars() moet worden gebruikt wanneer de inhoud wordt weergegeven van een variabele die speciale HTML-tekens kan bevatten.

phpinfo()

De phpinfo()-functie is een van de belangrijkste in PHP. Het geeft informatie weer over PHP-instellingen, de waarden van verschillende configuratievariabelen...

Waarom vermeld ik dit in een artikel over formulieren? phpinfo() is een handig debugprogramma. phpinfo() drukt onder andere de waarden af ​​van alle $_GET-, $_POST- en $_SERVER-variabelen. Dus als een formuliervariabele verloren gaat, is de eenvoudigste manier om erachter te komen wat er mis is het gebruik van de functie phpinfo(). Om ervoor te zorgen dat de functie alleen de waarden van variabelen weergeeft (en zonder dat je door tientallen pagina's hoeft te scrollen), moet deze als volgt worden aangeroepen: phpinfo(INFO_VARIABLES); , of - wat absoluut hetzelfde is - phpinfo(32) ;.



">
Vul uw naam in:


phpinfo(32);
?>



Of bijvoorbeeld deze situatie: je wilt het IP-adres van een bezoeker achterhalen. Je herinnert je dat de corresponderende variabele is opgeslagen in de array $_SERVER, maar - pech - je bent vergeten hoe de variabele precies heet. Roep opnieuw phpinfo(32); , zoek naar uw IP-adres in het bord en vind het in de regel $_SERVER["REMOTE_ADDR"] .

Laboratoriumwerk 1. HTTP-protocol. Methoden GET, POST. HTML-formulieren.

Theoretisch gedeelte

Levenscyclus van HTTP-aanvragen

  1. Browser opent verbinding met de server
  2. De browser stuurt een verzoek naar de server om de pagina te ontvangen
  3. De server genereert een reactie (meestal HTML-code) op de browser en sluit de verbinding
  4. De browser verwerkt de HTML-code en geeft de pagina weer

Let op het gemarkeerde vetgedrukt. Nog voordat u de gevraagde pagina op het scherm ziet, is de verbinding met de server verbroken en is deze u vergeten. En wanneer u een ander (of hetzelfde) adres invoert, of op een link klikt, of op een HTML-formulierknop klikt, herhaalt hetzelfde patroon zich opnieuw.

Dit soort werk heet "client server". De client is in dit geval de browser.

De verbinding met de webserver duurt dus slechts enkele seconden (of fracties van seconden) - dit is de tijdsperiode tussen het klikken op een link (of een ander type verzoek) en het moment waarop de pagina wordt weergegeven. De meeste browsers geven een soort indicator weer tijdens de verbinding. MS Internet Explorer geeft bijvoorbeeld een animatie weer in de rechterbovenhoek.

Om voor altijd af te komen van de perceptie van HTTP als een ‘black box’, laten we ons ‘doen alsof’ we een browser zijn die telnet gebruikt:

  1. Laten we lanceren telnet ya.ru 80
  2. Laten we het volgende in het terminalvenster invoeren (als de invoer niet wordt weergegeven, is dat geen probleem):

GET / HTTP/1.0[druk hier op Enter]
Gastheer: ya.ru[hier druk je tweemaal op Enter]

Het indrukken van Enter komt meestal overeen met de combinatie van tekens CR + LF, aangeduid als \r\n. Deze notatie zal hieronder worden gebruikt.

De HTML-code van de pagina http://ya.ru/ zal over het scherm lopen. Zoals je kunt zien, niets ingewikkelds.

De broncode van de huidige pagina kan in vrijwel elke browser worden bekeken door in het menu "Bekijk|Bron" te selecteren.

Foto's, kaders - dit zijn allemaal aanvullende verzoeken, precies hetzelfde. Waar komen de afbeeldingen in het browservenster eigenlijk vandaan: bij het parseren (verwerken) van HTML-code komt de browser de tag https://i2.wp.com/ tegen afbeelding"> doet een extra verzoek aan de server - request Afbeeldingen en geeft deze weer op de plaats waar de tag zich bevindt .



Poging:

Telnet www.google.ru 80

KRIJG /php/php5ru.png HTTP/1.0\r\n
Gastheer: ya.ru\r\n\r\n

Wat u ziet als u dit png-bestand in een teksteditor bekijkt, flitst over het scherm.

ik-2. HTML-formulieren. Methoden voor het verzenden van gegevens naar de server

U bent waarschijnlijk al HTML-formulieren tegengekomen:

  1. Vul uw naam in:

Door deze code op te slaan in een HTML-bestand en deze te bekijken met uw favoriete browser, ziet u een bekend HTML-formulier:

Vul uw naam in:

Laten we de tags die in dit korte voorbeeld worden gebruikt eens nader bekijken.

Label

, met een gepaarde eindtag
, stelt feitelijk het formulier in. De attributen zijn beide optioneel:

  • actie- geeft de URL aan (volledig of relatief) waarnaar de verstuurd formulier. Het indienen van een formulier is hetzelfde verzoek aan de server als alle andere (zoals ik hierboven al heb beschreven).

Als dit kenmerk niet is opgegeven, sturen de meeste browsers (meer precies, alle bij mij bekende browsers) het formulier naar het huidige document, dat wil zeggen 'naar zichzelf'. Dit is een handige afkorting, maar volgens de HTML-standaard is het action-attribuut vereist.

  • methode - manier het formulier indienen. Er zijn er twee.
    • KRIJGEN- formuliergegevens verzenden in de adresbalk.
      Mogelijk hebt u op verschillende websites de aanwezigheid van een "?" aan het einde van de URL opgemerkt. en de volgende gegevens in het formaat parameter=waarde. Hier komt "parameter" overeen met betekenis attribuut naam formulierelementen (zie hieronder over de tag ), en "waarde" - de inhoud van het attribuut waarde(het bevat bijvoorbeeld gebruikersinvoer in een tekstveld met dezelfde tag ).
      Probeer bijvoorbeeld iets te zoeken in Yandex en let op de adresbalk van de browser. Dit is de GET-methode.
    • NA- formuliergegevens worden verzonden naar lichaam aanvragen. Als het niet helemaal duidelijk (of helemaal onduidelijk) is wat dit is, hoeft u zich geen zorgen te maken. We komen binnenkort op dit onderwerp terug.

Als attribuut methode niet gespecificeerd - "GET" wordt geïmpliceerd.

Label - sets vormelement, gedefinieerd door het attribuut type :

  • Betekenis "tekst" specificeert een tekstinvoerveld van één regel
  • Betekenis "indienen" specificeert een knop die, wanneer ingedrukt, veroorzaakt Bezig met verzenden formulieren naar de server

Andere waarden zijn mogelijk (en (niet de enige tag die een formulierelement definieert), maar we zullen ze in de volgende hoofdstukken bekijken.

Dus wat gebeurt er als we op "OK" klikken?

  1. De browser kijkt naar de elementen in het formulier en vormt daaruit de naam- en waardeattributen formulier gegevens. Stel dat de naam is ingevoerd Vasya. In dit geval zijn de formuliergegevens naam=Vasya&okbutton=OK
  2. De browser brengt een verbinding tot stand met de server en stuurt een verzoek naar de server voor het document dat in het attribuut is opgegeven actie label
    , met behulp van de gegevensverzendmethode die is opgegeven in het kenmerk methode(in dit geval - GET), waarbij formuliergegevens in het verzoek worden doorgegeven.
  3. De server analyseert het ontvangen verzoek, genereert een reactie, stuurt deze naar de browser en verbreekt de verbinding
  4. De browser geeft het document weer dat is ontvangen van de server

Hetzelfde verzoek handmatig verzenden (via telnet) ziet er als volgt uit (ervan uitgaande dat de domeinnaam van de site www.example.com is):

telnet www.voorbeeld.com 80

GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n
Host: www.voorbeeld.com\r\n
\r\n

Zoals u waarschijnlijk al geraden heeft, is het klikken op de knop Verzenden op een formulier met de verzendmethode "GET" hetzelfde als het typen van de overeenkomstige URL (met een vraagteken en formuliergegevens aan het einde) in de adresbalk van de browser: http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK

In feite wordt de GET-methode gebruikt wanneer u een document opvraagt ​​bij de server door simpelweg de URL in te voeren of op een link te klikken. Gebruik makend van , wordt de URL eenvoudigweg toegevoegd met een vraagteken en formuliergegevens.

Laten we nu de eerste regel van ons formulier vervangen door het volgende:

We hebben de verzendmethode opgegeven als "POST". In dit geval worden de gegevens op een iets andere manier naar de server verzonden:

telnet www.voorbeeld.com 80

POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n
Host: www.voorbeeld.com\r\n
Inhoudstype: application/x-www-form-urlencoded\r\n
Inhoud-lengte: 22\r\n
\r\n
naam=Vasya&okbutton=OK

Bij gebruik van de POST-methode worden de formuliergegevens na “twee Enters” verzonden naar lichaam verzoek. Alles hierboven is waar titel request (en toen we de GET-methode gebruikten, werden de formuliergegevens in de header verzonden). Om ervoor te zorgen dat de server weet bij welke byte hij moet stoppen met het lezen van de hoofdtekst van het verzoek, bevat de header de regel Inhoud lengte; dat de formuliergegevens in het formulier worden verzonden parameter1=waarde1¶meter2=waarde2..., en de waarden worden verzonden in de vorm van urlencode - dat wil zeggen precies hetzelfde als het gebruik van de GET-methode, maar in de hoofdtekst van het verzoek - wordt de server geïnformeerd door de header "Content-Type: application/x- www-formulier-urlencoded".

Het voordeel van de POST-methode is dat er geen limiet is aan de lengte van de formuliergegevensregel.

Bij gebruik van de POST-methode is het niet mogelijk om het formulier te verzenden door simpelweg “een link te volgen”, zoals bij GET het geval was.

Bij gebruik van een POST-formulier, in zijn attribuut actie U kunt ook GET-formulierparameters opgeven na het vraagteken. De POST-methode omvat dus de GET-methode.

Bijgewerkt 12/12/2015

Ondanks het feit dat het onderwerp van het rechtstreeks verzenden van e-mailberichten vanaf de pagina's van een site al behoorlijk afgezaagd is, concludeer ik, afgaande op de brieven die ik ontvang van bezoekers van mijn site, dat velen nog steeds kennislacunes hebben op dit gebied.

Dus in deze tutorial zullen we leren hoe we dat moeten doen formulier voor het verzenden van e-mailberichten vanaf webpagina's met controle op correcte gegevensinvoer. Die. Als een formulierveld niet is ingevuld, genereert het script een fout en wordt de bezoeker hiervan op de hoogte gesteld. U kunt een voorbeeld zien van hoe dit formulier werkt. Als u dit formulier invult en op de knop klikt: stuur een bericht, dan ontvang ik uw bericht.

De voordelen van het op deze manier verzenden van berichten liggen voor de hand:

1. U hoeft uw e-mailadres niet op internet te 'schijnen', wat betekent dat het niet bij spammers terechtkomt.

2. Als een bezoeker u een vraag wil stellen of hem iets wil vragen, hoeft hij niet het e-mailadres te kopiëren, zijn e-mailclient te openen, een bericht te schrijven, enz. De bezoeker vult snel de benodigde gegevens in het formulier in en stuurt je een bericht.

3. Met een dergelijke organisatie van feedback van bezoekers is de kans dat het bericht bij u wordt afgeleverd bijna 100%, vooral als het e-mailadres aan uw domein is gekoppeld. Tussenliggende knooppunten zijn immers uitgesloten van een lange mailketen. Dit betekent dat de betrouwbaarheid van de postbezorging dramatisch toeneemt.

Hoe maak ik een formulier voor het verzenden van berichten?

Dergelijke scripts bestaan ​​doorgaans uit twee delen en de code bevindt zich in twee verschillende bestanden:

  • Eerste bestand- dit is het formulier zelf waarin de berichtgegevens worden ingevuld.
  • Tweede bestand- dit is een afhandelingsbestand dat gegevens ontvangt van het formulier (het eerste bestand) en deze verzendt naar het e-mailadres dat in het script is opgegeven. Maar deze delen van het script werken altijd in paren.

We plaatsen het eerste deel van het script in een apart bestand en noemen het: mail.php. Dit bestand bevat het gegevensinvoerformulier. Bestandsnaam mail.php Ik heb het voorwaardelijk opgevat, je kunt dit bestand noemen hoe je maar wilt. Dit bestand kan bijvoorbeeld een andere extensie hebben .html.

Om sitebezoekers met dit bestand te contacteren, maken ze meestal een eenvoudige link: schrijf naar de auteur van de site, stuur een bericht of iets dergelijks. Wanneer een bezoeker op zo’n link klikt, wordt hij naar een aparte pagina geleid met een formulier waarin hij gegevens (informatie) moet invullen om een ​​bericht te kunnen versturen.

Maak dus een nieuw bestand en geef het een naam: mail.php of mail.html en plak de code erin Lijst 1.

Lijst 1









Gebruik het volgende formulier om een ​​bericht naar de auteur van de site te sturen:



Uw naam:


Jouw email:


Jouw bericht:




Dit is het eenvoudigste formulier, bestaande uit slechts 3 velden voor gegevensinvoer. Ik heb deze velden genoemd: uw naam, Jouw email, jouw bericht. Indien nodig kan het aantal velden worden vergroot.

De eerste twee velden: uw naam, Jouw email, worden beschreven door tags:

Uw naam:

maar elk van hen krijgt zijn eigen naam toegewezen, die zichzelf noemt identificatie: naam = "naam" En naam = "e-mail" overeenkomstig.

Het derde veld voor het invoeren van een bericht wordt beschreven door tags:

Jouw bericht:

Dit veld heeft een ID: naam = "puinhoop".

En natuurlijk zijn er twee knoppen: stuur een bericht En Duidelijke vorm.

Aan de gegevens (informatie) die de bezoeker in het formulier invoert, worden de juiste identificatiegegevens toegewezen: naam, e-mail En troep, onthoud - dit is belangrijk!

Voor het ontwerpgemak is het hele formulier in een gewone tabel geplaatst, waarvan het uiterlijk kan worden ontworpen met behulp van , voor mij is dit een klasse: class="td_border", Ik presenteer het hier niet nodig, voeg het zelf toe, naar jouw smaak.

Bestandsbehandelaar.

Het tweede deel van het script bestaat uit een handlerbestand: mail2.php, op welke manier NA Alle gegevens met de bijbehorende identificatiegegevens worden verzonden: naam, e-mail En troep. Hier worden deze gegevens in variabelen geplaatst: $naam, $ e-mail, $ puinhoop.

Maak een bestand mail2.php en schrijf de code erin Lijst 2:

Lijst 2

$naam = $_POST["naam"];
$e-mail = $_POST["e-mail"];
$puinhoop = $_POST["puinhoop"];

$REMOTE_ADDR = $_POST["REMOTE_ADDR"];

if (isset ($naam))
{
$naam = substr($naam,0,20); //Mag niet meer dan 20 tekens lang zijn
als (leeg($naam))
{
echo "

Naam niet gespecificeerd!!!

";
echo "";
Uitgang;
}
}
anders
{
$naam = "niet gespecificeerd";
}

if (isset ($e-mail))
{
$e-mail = substr($e-mail,0,20); //Mag niet meer dan 20 tekens lang zijn
als (leeg($email))
{
echo "

E-mail niet gespecificeerd!!!

";
echo " Ga terug en vul het formulier correct in.";
Uitgang;
}
}
anders
{
$email = "niet gespecificeerd";
}

als (isset ($rommel))
{
$mess = substr($mess,0,1000); //Mag niet meer dan 1000 tekens bevatten
als (leeg($mess))
{
echo "

Bericht niet geschreven!!!

";
echo " Ga terug en vul het formulier correct in.";
Uitgang;
}
}
anders
{
$mess = "niet gespecificeerd";
}

$i = "niet gespecificeerd";
if ($naam == $i EN $e-mail == $i EN $mess == $i)
{
echo "Let op! Er is een fout opgetreden! Je hebt de berichtvelden niet ingevuld!";
Uitgang;
}

$to = "beheerder@site";
$onderwerp = " Bericht van de sitesite";
$message = "Naam van afzender: $naam .\nE-mailadres: $email\nBericht: $mess .\nIP-adres: $_SERVER";
mail ($to,$subject,$message,"Content-type:text/plain; charset = windows-1251 ") of print "Ik kan geen brief sturen!!!";
echo "

Bedankt voor het verzenden van uw bericht.

Het is heel belangrijk voor mij!

Je krijgt zeker snel antwoord.";
Uitgang;
?>

Dit bestand controleert de gegevens die de bezoeker van de site in het formulier heeft ingevoerd en stuurt vervolgens een bericht naar het opgegeven e-mailadres.

Als velden leeg worden gelaten of onjuist worden ingevuld, stuurt het script een bericht terug naar de bezoeker met de specifieke reden.

Houd er rekening mee dat het bestand: mail2.php moet een extensie hebben .php , omdat het verzenden van een bericht gebeurt met behulp van de functie mail PHP.

En uiteraard moet je Hosting PHP ondersteunen. Dit geldt vooral voor gratis hosting, hoewel sinds kort ook voor gratis hosting bijna overal PHP is geïnstalleerd.

In code Lijst 2 Het is eenvoudig: corrigeer alle rood gemarkeerde waarden om aan uw wensen te voldoen, namelijk:

  • registreer de jouwe E-mailadres, waarnaar berichten worden verzonden (variabel $aan);
  • corrigeer het onderwerp van het bericht (variabel $onderwerp);
  • let op de codering ( tekenset=windows-1251). Voer de codering in die op uw site wordt gebruikt. Op het Russischtalige internet kan de codering zijn: "utf-8" of "windows-1251". Als je een fout maakt met de codering, wordt de tekst in de brief verkeerd weergegeven (gek).

Dat is alles, het enige wat u nu nog hoeft te doen is de bestanden uploaden: mail.php En mail2.php en er verschijnt een handig formulier voor het verzenden van berichten op uw website.



Reacties op dit artikel (les):

Bedankt voor de les. Het is waar wat ze zeggen: alles komt op tijd. Vandaag ging ik op internet zoeken hoe ik een contactformulier voor een website kon maken, en een onafhankelijk formulier. Ik begrijp dat deze het zal doen.

Goede les! Bedankt!

Bedankt Andrey, goede les.

Bedankt, ik denk dat het nuttig zal zijn

Savin Dmitry Aleksandrovich (SAVIN DMITRY ALEXANDROVICH) schrijft je, ik wil alles in meer detail weten over formulieren in CSS, ik weet hier weinig van: meer gedetailleerd over de actie-eigenschap, zoals ik weet, is actie een link naar het document waar het gegevensverzoek wordt verzonden of de gegevens zelf uit het formulier, of iets dergelijks.method="post" verwerkt gegevens in grotere formaten dan get, enz. Alsjeblieft, meer over de formulieren, ik heb er bijna geen idee van.

Hallo Andrei! Wat jou betreft, Ahmad. Ik wil dus ook een “Voeg uw commentaar toe” op de site zodat bezoekers hun beoordelingen kunnen achterlaten. Welke code moet ik schrijven? Bedankt, ik vond het leuk

Knap! zeer nuttige informatie!

Het is nuttig, het is nuttig, maar het werkt niet. Na het invullen van het formulier wordt de mail2.php-lijst weergegeven

Het is nuttig, het is nuttig, maar het werkt niet. Na het invullen van het formulier wordt de mail2.php-lijst weergegeven

Alles werkt goed, alleen de knoppen zijn niet volumineus zoals die van de auteur. Kan iemand mij vertellen hoe ik volumineuze knoppen kan maken? Dank aan de auteur!

maar het werkt niet voor mij. Om precies te zijn, het werkt met de helft. De brief is verzonden, maar leeg. gegevens van mail1 gaan niet naar mail2

Komt niet naar e-mail. Wat is het addertje onder het gras? Ik begrijp niet hoe hij iets kan verzenden zonder login en wachtwoord. Is dit een mailserver? Eenvoudig formulier en dat is alles

Bedankt voor het formulier! Werken! Als het voor u niet werkt, volgt u elke stap zorgvuldig. Bij mij lukte het ook niet meteen. André, nogmaals bedankt!

Help alstublieft, ik heb het formulier ingevoegd en alles lijkt in orde te zijn, maar het bericht bereikt niet het e-mailadres dat ik heb opgegeven, hoewel er staat dat het bericht is verzonden...

Vertel me, hoe kan ik ervoor zorgen dat na het (mislukt) verzenden van een brief, er geen nieuw venster wordt geopend en het schrijven in het oude wordt gedaan?

Andrej. Ik begrijp dat de handler wordt gebeld. Ik weet nog niet zoveel van PHP. Maar dit is wat ik graag zou willen bereiken: er is maar één pagina met het mailformulier, namelijk Nadat u op "Bericht verzenden" hebt geklikt, wordt er geen nieuw venster geopend, maar verandert de huidige pagina. Dat wil zeggen, zoals ik het begrijp, het is dynamisch. Ik ben er zelf nog niet achter hoe ik dit moet doen, dus vraag ik om advies.

Andrey, vertel me alsjeblieft dat het formulier prima werkt in Chrome, maar er is een probleem met Explorer. Berichten worden niet afgeleverd en fout- of verzendberichten worden niet weergegeven. Wat is er aan de hand? Alvast bedankt

Toffe les! Bedankt!

Bedankt. Alles werkt prima)

Er zijn geen afsluitende /p-tags in de code. Waarom?

Waarschuwing: mail(): "sendmail_from" niet ingesteld in php.ini of aangepaste header "From:" ontbreekt in E:Roomsu362571transport-online.netwwwmail.php op regel 66 Ik kan geen brief verzenden!!! Wauw - hoe wordt het?

Ik kan de codering niet achterhalen. Als u Windows-1251 invoert, is de tekst van het script in het bericht normaal, maar de tekst van het bericht zelf wordt in krokodillen naar de e-mail verzonden. en als je utf-8 plaatst - de tekst van het script in het bericht in de mail - vraagtekens, en de tekst van het bericht uit het formulier - normaal. Hoe kan ik ervoor zorgen dat beide normaal zijn?

Het werkt niet voor mij, maar de site wordt nog niet gehost. Wanneer zal ik het posten?

Alles werkt, bedankt voor het script! Vertel me alstublieft hoe ik ervoor kan zorgen dat wanneer u op de knop Verzenden klikt, er geen nieuwe pagina met een handler wordt geopend. Zodat de site op de pagina blijft waar deze was voordat u op de verzendknop drukte?

hoe kan ik het e-mailinvoerveld hoger maken?

Als u brieven naar meerdere adressen moet sturen, voegt u eenvoudigweg de vereiste adressen toe, gescheiden door komma's, zoals deze: $to = "admin@site, [e-mailadres beveiligd], [e-mailadres beveiligd]";

Hoe kan ik ervoor zorgen dat er na het verzenden van een bericht een doorverwijzing naar een andere pagina plaatsvindt?

er is $to = "admin@site"; Vraag: of het nodig is om naar 2 adressen te sturen! een van de adressen in de vorm $to = "$email"; met andere woorden, de functionaliteit “aanbevelen aan een vriend” met duplicatie van het bericht naar mijn opgegeven e-mailadres. Bedankt.

Om de een of andere reden werkt het feedbackformulier niet voor mij, en niets ervan werkt. Doet alsof het bericht is verzonden, maar het komt niet per post aan.

Hallo! Leg eens uit waarom het niet werkt op de hosting, er staat: “Ik kan geen brief sturen.” Maar het werkt prima op localhost in Denver. Wat is het probleem?...

waarom werken meer dan één van mijn formulieren niet?

Hartelijk dank. Alles is heel eenvoudig en toegankelijk. Ik heb je voorbeeld gebruikt op de website gosdogovor.ru. Ik heb het ontwerp een beetje aangepast om bij mezelf en de samenstelling van de velden te passen: http://www.gosdogovor.ru/easuzcon.html. Nogmaals bedankt.

Jongens, als je een bericht probeert te verzenden vanaf je lokale server, dat wil zeggen vanaf een site die nog niet op internet is geplaatst, zul je niet slagen. Plaats het op een hosting, en je zult blij zijn)

Andrey, hoe kan ik ervoor zorgen dat wanneer ik op een knop druk, er een bericht met een specifieke tekst naar een specifiek adres wordt verzonden? Help me alsjeblieft: [e-mailadres beveiligd]

Het formulier zelf is meestal bedoeld om informatie van de gebruiker te ontvangen en deze vervolgens naar de server te sturen, waar de formuliergegevens worden ontvangen door het afhandelingsprogramma. Zo'n programma kan worden geschreven in elke programmeertaal aan de serverzijde, zoals PHP, Perl, enz. Het programmaadres wordt aangegeven in het action-attribuut van de tag

, zoals weergegeven in voorbeeld 1.

Voorbeeld 1: Formuliergegevens indienen

HTML5 IE Cr Op Sa Fx

Formuliergegevens



In dit voorbeeld worden de formuliergegevens aangegeven door het naamattribuut (login en wachtwoord) doorgegeven aan het bestand /example/handler.php. Als het actiekenmerk niet is opgegeven, vindt de overdracht plaats naar het adres van de huidige pagina.

Overdracht naar de server vindt plaats op twee verschillende manieren: GET en POST, om de methode in de tag in te stellen

Het method-attribuut wordt gebruikt en de waarden ervan zijn de get- en post-trefwoorden. Als het methodekenmerk niet is opgegeven, worden de gegevens standaard naar de server verzonden met behulp van de GET-methode. In tafel Figuur 1 laat de verschillen tussen deze methoden zien.

Welke methode wordt gebruikt, kan eenvoudig worden bepaald aan de hand van de adresbalk van de browser. Als er een vraagteken in staat en het adres ziet er zo uit, dan is dit zeker een GET.

http://www.google.ru/search?q=%D1%81%D0%B8%D1%81%D1%8C%D0%BA%D0%B8&ie=utf-8

Een unieke combinatie van parameters in de adresbalk identificeert een pagina op unieke wijze, dus pagina's met de adressen ?q=node/add en ?q=node worden als verschillend beschouwd. Deze functie wordt gebruikt door contentmanagementsystemen (CMS, Contentmanagementsysteem) om veel websitepagina's te maken. In werkelijkheid wordt er één enkel bestand gebruikt dat een GET-verzoek ontvangt en op basis daarvan de inhoud van het document genereert.

Hieronder vindt u typische toepassingen van deze methoden op locaties.

KRIJGEN

Kleine tekstgegevens overbrengen naar de server; Site zoeken.

Zoekmachines en sitezoekformulieren worden altijd verzonden met behulp van de GET-methode. Hiermee kunt u zoekresultaten delen met vrienden, een link per e-mail verzenden of deze op een forum plaatsen.

NA

Bestanden overbrengen (foto's, archieven, programma's, enz.); opmerkingen verzenden; berichten toevoegen en bewerken op het forum, blog.

Standaard wordt het formulier verwerkt in het huidige browsertabblad. Wanneer u het formulier verzendt, kunt u deze parameter wijzigen en de formulierhandler in een nieuw tabblad of frame openen. Dit gedrag wordt gespecificeerd via de ‘contextnaam’, wat de waarde is van het doelattribuut van de tag . Populaire waarden zijn _blank om het formulier in een nieuw venster of tabblad te openen, en de naam van het frame, die wordt gespecificeerd door het name-attribuut van de tag



Wanneer u in dit voorbeeld op de knop Verzenden klikt, wordt het resultaat van de indiening van het formulier geopend in een frame met de naam area .

Formulierelementen worden traditioneel in een tag geplaatst

, waarmee wordt bepaald welke gegevens naar de server worden verzonden. Tegelijkertijd heeft HTML5 de mogelijkheid om een ​​formulier van zijn elementen te scheiden. Dit wordt gedaan voor het gemak en de veelzijdigheid, dus een complexe lay-out kan verschillende formulieren bevatten die elkaar niet mogen kruisen, of sommige elementen worden bijvoorbeeld weergegeven met behulp van scripts op de ene plaats op de pagina en het formulier zelf bevindt zich op een andere plaats. . De verbinding tussen het formulier en zijn elementen vindt in dit geval plaats via de formulieridentificatie, en het vormattribuut met een waarde gelijk aan deze identificatie moet aan de elementen worden toegevoegd (voorbeeld 3).

Voorbeeld 3: Een formulier aan velden koppelen

HTML5 IE Cr Op Sa Fx

Formulier



In dit voorbeeld de tag

wordt op unieke wijze geïdentificeerd via de auth-identifier, en form="auth" wordt toegevoegd aan velden die via het formulier moeten worden ingediend. In dit geval verandert het gedrag van de elementen niet; wanneer op de knop wordt geklikt, worden de login en het wachtwoord naar de handler.php-handler verzonden.

Hoewel de parameters voor formulieroverdracht traditioneel in de tag worden gespecificeerd , ze kunnen ook worden overgebracht naar de formulierverzendknoppen (