En ). Hiervoor wordt een set attributen formaction , formmethod , formenctype en formtarget gebruikt, die analogen zijn van de overeenkomstige attributen zonder het formuliervoorvoegsel. Voorbeeld 4 toont het gebruik van deze attributen.Voorbeeld 4: Een formulier indienen
HTML5 IE Cr Op Sa Fx
Een formulier indienen
Alle nieuwe formulierkenmerken worden niet door sommige browsers ondersteund, met name door Internet Explorer en Safari.
Een van de meest populaire functies op de site is het aanvraag- of bestelformulier, waarvan de gegevens per e-mail naar de site-eigenaar worden verzonden. Dergelijke formulieren zijn in de regel eenvoudig en bestaan uit twee of drie velden voor gegevensinvoer. Hoe maak je zo’n bestelformulier aan? Hiervoor is het gebruik van HTML-opmaaktaal en PHP-programmeertaal vereist.
De HTML-opmaaktaal zelf is eenvoudig; u hoeft alleen maar uit te zoeken hoe en waar u bepaalde tags moet plaatsen. Met de programmeertaal PHP zijn de zaken iets ingewikkelder.
Voor een programmeur is het maken van zo'n formulier niet moeilijk, maar voor een HTML-lay-outontwerper lijken sommige acties misschien moeilijk.
Maak een formulier voor het indienen van gegevens in html De eerste regel zal als volgt zijn
Laten we nu alles samenvoegen.
Laten we nu de velden in het formulier verplicht maken. We hebben de volgende code:
Maak een bestand dat gegevens uit het HTML-formulier accepteert Dit zal een bestand zijn met de naam send.php
In het bestand moet u in de eerste fase gegevens uit de post-array accepteren. Om dit te doen, maken we twee variabelen:
$fio = $_POST["fio"]; $e-mail = $_POST["e-mail"];
Variabelenamen in PHP worden voorafgegaan door een $-teken en aan het einde van elke regel wordt een puntkomma geplaatst. $_POST is een array waarnaar gegevens uit het formulier worden verzonden. In het HTML-formulier wordt de verzendmethode gespecificeerd als method="post". Er worden dus twee variabelen uit het HTML-formulier geaccepteerd. Om uw site te beschermen, moet u deze variabelen door verschillende filters sturen: php-functies.
De eerste functie converteert alle tekens die de gebruiker aan het formulier probeert toe te voegen:
In dit geval worden er geen nieuwe variabelen aangemaakt in php, maar worden bestaande variabelen gebruikt. Wat het filter zal doen is het personage transformeren "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
De tweede functie decodeert de URL als de gebruiker deze aan het formulier probeert toe te voegen.
$fio = urldecode($fio); $email = urldecode($email);
Met de derde functie verwijderen we eventuele spaties aan het begin en einde van de regel:
$fio = trim($fio); $email = trim($email);
Er zijn andere functies waarmee u php-variabelen kunt filteren. Het gebruik ervan hangt af van hoe bezorgd u bent dat een aanvaller programmacode zal proberen toe te voegen aan dit HTML-e-mailinzendingsformulier.
Validatie van gegevens overgedragen van HTML-formulier naar PHP-bestand
Om te controleren of deze code werkt en of er gegevens worden overgedragen, kunt u deze eenvoudig op het scherm weergeven met behulp van de echofunctie:
echo $fio; echo " "; echo $fio;
De tweede regel hier is nodig om de uitvoer van php-variabelen in verschillende regels te verdelen.
Ontvangen gegevens van een HTML-formulier naar e-mail verzenden met behulp van PHP Om gegevens per e-mail te verzenden, moet u de mailfunctie in PHP gebruiken.
mail("naar welk adres moet worden verzonden", "onderwerp van de brief", "Bericht (hoofdtekst van de brief)", "Vanaf: vanuit welke e-mail de brief wordt verzonden \r\n");
U moet bijvoorbeeld gegevens naar het e-mailadres van de site-eigenaar of -beheerder sturen [e-mailadres beveiligd] .
Het onderwerp van de brief moet duidelijk zijn en de boodschap van de brief moet bevatten wat de gebruiker heeft opgegeven in het HTML-formulier.
mail(" [e-mailadres beveiligd] ", "Toepassing van de site", "Volledige naam:".$fio.". E-mail: ".$email ,"Van: [e-mailadres beveiligd] \r\n");
Het is noodzakelijk om een voorwaarde toe te voegen die controleert of het formulier via PHP naar het opgegeven e-mailadres is verzonden.
als (mail(" [e-mailadres beveiligd] ", "Bestel via de site", "Volledige naam:".$fio.". E-mail: ".$email ,"Van: [e-mailadres beveiligd] \r\n")) { echo "bericht succesvol verzonden"; ) anders ( }
De programmacode van het send.php-bestand, dat de HTML-formuliergegevens naar de mail verzendt, ziet er dus als volgt uit:
$fio = $_POST["fio"]; $e-mail = $_POST["e-mail"]; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $fio = trim($fio); $email = trim($email); //echo $fio; // echo " "; // echo $ e-mail; als (mail(" [e-mailadres beveiligd] ", "Toepassing van de site", "Volledige naam:".$fio.". E-mail: ".$email ,"Van: [e-mailadres beveiligd] \r\n")) ( echo "bericht succesvol verzonden"; ) anders ( echo "Er zijn fouten opgetreden tijdens het verzenden van het bericht"; }?>
Drie regels om te controleren of de gegevens naar het bestand worden overgebracht, zijn van commentaar voorzien. Indien nodig kunnen ze worden verwijderd, omdat ze alleen nodig waren voor foutopsporing.
De HTML- en PHP-code voor het versturen van het formulier plaatsen wij in één bestand In de commentaren op dit artikel stellen veel mensen de vraag hoe ze ervoor kunnen zorgen dat zowel het HTML-formulier als de PHP-code voor het verzenden van gegevens naar e-mail in één bestand staan, en niet in twee.
Om dit werk te implementeren, moet u de HTML-code van het formulier in het bestand send.php plaatsen en een voorwaarde toevoegen die controleert op de aanwezigheid van variabelen in de POST-array (deze array wordt verzonden vanuit het formulier). Dat wil zeggen, als de variabelen in de array niet bestaan, moet u de gebruiker het formulier laten zien. Anders moet u gegevens uit de array ontvangen en naar de ontvanger sturen.
Laten we eens kijken hoe we de PHP-code in het send.php-bestand kunnen wijzigen:
Aanvraagformulier van de site //controleer of er variabelen bestaan in de POST-array if(!isset($_POST["fio"]) en !isset($_POST["e-mail"]))( ?>
) anders ( // toon het formulier $fio = $_POST["fio"]; $e-mail = $_POST["e-mail"]; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $fio = trim($fio); $email = trim($email); als (mail(" [e-mailadres beveiligd] ", "Toepassing van de site", "Volledige naam:".$fio.". E-mail: ".$email ,"Van: [e-mailadres beveiligd] \r\n"))( echo "Bericht succesvol verzonden"; ) anders ( echo "Er zijn fouten opgetreden tijdens het verzenden van het bericht"; } } ?>
We controleren het bestaan van een variabele in de POST-array met de isset() PHP-functie. Een uitroepteken vóór deze functie in een voorwaarde betekent ontkenning. Dat wil zeggen, als de variabele niet bestaat, moeten we onze vorm tonen. Als ik het uitroepteken niet had geplaatst, zou de voorwaarde letterlijk betekenen: ‘als het bestaat, toon dan de vorm’. En dat is in ons geval verkeerd. Uiteraard kunt u de naam ervan wijzigen in index.php. Als u de naam van het bestand wijzigt, vergeet dan niet de bestandsnaam in de regel te hernoemen
Door deze code op te slaan in een HTML-bestand en deze te bekijken met uw favoriete browser, ziet u een bekend HTML-formulier:
Label
, 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. Dit is de GET-methode.
Label 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.
- specificeert een vormelement gedefinieerd door het type attribuut:
Andere waarden zijn mogelijk (en 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
(niet de enige tag die een formulierelement specificeert).
Dus wat gebeurt er als we op "OK" klikken?
De server analyseert het ontvangen verzoek, genereert een reactie, stuurt deze naar de browser en verbreekt de verbinding
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 verzendknop op een formulier met een "GET" verzendmethode 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. Bij gebruik
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.
=$_SERVER["PHP_SELF"]?>- verkorte vorm voor echo $_SERVER["PHP_SELF"]; ?> .
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 verzoektekst alleen namen en waarden specificeert en 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" ] . " !"
;
}
?>
Op regel 8 zou je net zo gemakkelijk kunnen schrijven
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.
$naam = 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 "
"
;
}
?>
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:
Voer 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 heel redelijk: met zo'n bericht kun je snel moeilijk te detecteren typefouten in de namen van variabelen vinden, 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.
Heb je het? 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 er ongeveer als volgt uitzien:
Voer 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 "
"
;
}
?>
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) ;.
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
Browser opent verbinding met de server De browser stuurt een verzoek naar de server om de pagina te ontvangen De server genereert een reactie (meestal HTML-code) op de browser en sluit de verbinding 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 voorgoed af te komen van de perceptie van HTTP als een ‘black box’, laten we ons ‘doen alsof’ we een browser zijn die telnet gebruikt:
Laten we lanceren telnet ya.ru 80 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 eigenlijk vandaan in het browservenster: bij het parseren (verwerken) van HTML-code komt de browser de tag https://i1.wp.com/ tegen afbeelding"> doet een extra verzoek aan de server - request foto's 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:
Voer uw naam in: