Grundläggande formulärhantering

I denna lektionen går vi igenom hur man låter en besökare på hemsidan fylla i ett formulär och skicka den till en sida där vi hanterar den med PHP.

Kommer du ihåg hur man skapar formulär i HTML? Om du inte gör det kommer du troligtvis ha svårigheter att följa med i denna lektionen, så vi rekommenderar starkt att du går tillbaka till den lektionen och påminner hjärncellerna lite. Du behöver dock bara läsa på om hur taggarna <form> och <input> (med type="text") fungerar, för de är de enda vi ska använda här. Hur de andra formulärtaggarna fungerar får du lära dig i en kommande lektion lite längre fram.

Men vi börjar med en vanlig HTML-sida innehållande ett enkelt formulär.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Skicka formulär</title> </head> <body> <form method="get" action="taEmot.php"> Fyll i ditt namn: <input type="text" name="namnet"><br> <input type="submit" value="Skicka"> </form> </body> </html>
Fyll i ditt namn:

Det finns några saker att notera här som PHP-sidan som ska ta emot formuläret (och som vi snart ska koda) behöver veta. Först och främst är det namnet på den PHP-filen. Vi har med hjälp av attributet action i taggen <form> talat om för webbläsaren att skicka formuläret till sidan taEmot.php, så vår PHP-fil måste heta "taEmot.php". I denna PHP-fil måste vi även veta hur informationen har skickats och inte minst vad som har skickats. Med attributet method i taggen <form> har vi talat om för webbläsaren att skicka informationen genom metoden get (och inte det andra alternativet, metoden post), och med attributet name i taggen <input> har vi talat om för webbläsaren att skicka det ifyllda namnet med nyckeln angivetNamn. Vi vet ännu inte vad besökaren kommer att fylla i textfältet, men vi vet att vi kan referera till det värdet med hjälp av nyckeln angivetNamn.

Så, början på vår PHP-fil är alltså detta:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Ta emot formulär</title> </head> <body> <?php /* Vad har vi åstadkommit hittills? Jo, filen heter ju i alla fall "taEmot.php" :) */ ?> </body> </html>

Men hur kommer vi åt texten besökaren har fyllt i textfältet? Jo, i PHP finns det några variabler som är fördefinierade (det vill säga, de finns redan utan att vi som programmerare behöver skapa dem), och de vi behöver känna till för att kunna hantera information skickad med hjälp av ett formulär är variablerna $_GET och $_POST. Om formuläret skickas genom metoden get finns den ifyllda informationen i variabeln $_GET, annars, om formuläret skickas genom metoden post, finns informationen i variabeln $_POST.

Så, i vårt exempel, där formuläret skickas genom metoden get, återfinns alltså namnet besökaren har fyllt i i variabeln $_GET, men hur kommer vi åt det värdet? Jo, nu har vi nytta av att veta att textfältet skickas ihop med nyckeln ifylltNamn, för $_GET är nämligen en associativ array där nyckeln ifylltNamn innehåller värdet besökaren har fyllt i. Vi kan alltså komma åt värdet genom att skriva $_GET['ifylltNamn'].

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Ta emot formulär</title> </head> <body> <?php echo 'Du fyllde i att ditt namn är "'.$_GET['ifylltNamn'].'".'; ?> </body> </html>

Om besökaren till exempel fyllt i namnet "Peppe L-G" skulle taEmot.php generera följande output:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Ta emot formulär</title> </head> <body> Du fyllde i att ditt namn är "Peppe L-G". </body> </html>
Du fyllde i att ditt namn är "Peppe L-G".

$_POST fungerar på precis samma sätt som $_GET, men den får man använda då formuläret skickas genom metoden post.

Nu kommer ett litet exempel där besökaren får fylla i två tal i ett formulär och skicka det genom metoden post till en PHP-sida där summan av talen visas.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Fylla i talen</title> </head> <body> <form method="post" action="summeraTal.php"> Fyll i två tal och se summan av dem när du trycker på skicka-knappen!<br> Tal 1: <input type="text" name="tal1"><br> Tal 2: <input type="text" name="tal2"><br> <input type="submit" value="Beräkna summa"> </form> </body> </html>
Fyll i två tal och se summan av dem när du trycker på skicka-knappen!
Tal 1:
Tal 2:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Beräknas summa</title> </head> <body> <?php echo 'Summan av '.$_POST['tal1'].' och '.$_POST['tal2'].' är '.($_POST['tal1']+$_POST['tal2']).'.'; ?> </body> </html>

Du kan nu grunderna för hur man hanterar information skickad från formulär i PHP, men det finns mycket mer att säga i ämnet, inte minst angående säkerhet. Det är bland annat via formulär crackare (crackare = hackare med onda avsikter) gör intrång i system och försöker åstadkomma sådant de inte är avsedd att kunna. I det senaste exemplet ovan kontrollerar vi till exempel aldrig att $_POST['tal1'] och $_POST['tal2'] är tal, så besökaren kan till exempel fylla i texter istället. Vad händer när man försöker addera dem i PHP? Kan det leda till ett beteende som gör att PHP visar information för besökaren en crackare kan använda sig av? Till exempel ett felmeddelande som oavsiktligt avslöjar hur vår PHP-kod är uppbyggd?

Just i exemplet ovan kan en crackare inte åstadkomma några allvarliga saker, men det är värt att nämna att man aldrig kan lita på att en besökare fyller i information den är avsedd att fylla i, man måste validera allting en besökare skriver in för att vara på den säkra sidan. I exemplet ovan kan man inte ens vara säker på $_POST['tal1'] och $_POST['tal2'] finns, för när PHP-filen (summeraTal.php) körs kan man inte kolla ifall besökaren kommer ifrån sidan med formuläret (fyllITalen.html) eller från en annan sida. Ta till exempel följande HTML-sida:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Fylla i talen</title> </head> <body> <form method="post" action="http://www.dinHemsida.se/summeraTal.php"> Fyll i två tal och se summan av dem när du trycker på skicka-knappen!<br> Tal 1: <input type="text" name="tal1"><br> <input type="submit" value="Beräkna summa"> </form> </body> </html>

Crackaren kan utan problem skapa ett likadant formulär på sin hemsida, men till exempel ta bort ett av textfälten. När han skickar detta formuläret kommer din PHP-kod (som förutsätter att $_POST['tal2'] finns) inte att fungera till 100%.

Man måste alltså validera allting, man kan aldrig lita på att besökarna gör det man förväntar sig dem ska göra. I 99% av fallen gör de troligtvis det man förväntar sig dem ska göra, men sen finns den återstående procenten crackare som försöker utnyttja dessa små säkerhetshål, och då gäller det att vara förberedd!

Hur man validerar information skickad från besökare kommer du få lära dig i kommande lektioner, men du kan nu en av de största styrkorna med PHP: låta besökaren kommunicera med hemsidan - en avgörande faktor för att skapa en dynamisk och intressant hemsida.

Gå till nästa lektion, PHPs inbyggda funktioner.