Till Startsidan
JavaScript.nu hostas av Ballou.se

Skaffa webbhotell
Från 12 kr/månad.

100 kr rabatt för JavaScript.nu-
besökare.

JavaScript.nu / Perl-kurs / Formulärdata

LÄR DIG ATT PROGRAMMERA PERL
Formulärdata

På internet finns det massvis av formulär. De kan vara till för olika saker, t.ex. maila, söka på söktjänster, registrera sig för tjänster, skriva i gästböcker etc.
Du ska i detta kapitel lära dig att göra formulär som skickar information och script som tar emot och bearbetar denna information.
Vi börjar med ett formulär som skickar informationen med metoden POST (dvs, informationen som skickas visas inte i adressfältet):
Formuläret på valfri sida:
<FORM ACTION="scriptet.pl" METHOD="post">
Din hemsida: <INPUT TYPE="text" NAME="url">
<INPUT TYPE="submit" VALUE="Skicka information">
</FORM>

Scriptet:
#!/usr/bin/perl

sub hamta_form
{
read(STDIN, $minnet, $ENV{'CONTENT_LENGTH'});	# Läser in det som postats till $minnet
@delar = split(/&/, $minnet);			# $minnet splitras till en array
foreach $info (@delar)				# Letar genom arrayens alla delar
	{
	($namn, $varde) = split(/=/, $info);	# I detta script: namn=url; varde=det man fyllt i
	$varde =~ tr/+/ /;
	$varde =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$varde =~ s/<!--(.|\n)*-->//g;
	$FORM{$namn} = $varde;			# Informationen lagras i hashen FORM
	}
}

&hamta_form;					# Anropar hamta_form

if ($FORM{'url'})				# Om url finns i hashen FORM
{
$url= "$FORM{'url'}";				# Så lagras den i variabeln url
}

print "Content-type:text/html\n\n";
print "Din <A HREF=\"$url\">hemsida</A> är fin. :)";

Utmatning (om inmatning: http://www.JavaScript.nu/):
Din <A HREF="http://www.JavaScript.nu/">hemsida</A> är fin. :)";
If-satser är än så länge något nytt för dig, vi kommer senare i kursen lära oss mer om vad if ($FORM{'url'}) egentligen har för funktion i scriptet.

Det du nu bör lägga märke till i scriptet är att vi först använde ett forumlär med ett fält som hette url, och sedan skapade vi en variabel i scriptet som hette just url och som hade det värde vi fyllde i url-fältet i vårt formulär.

Du undrar nu säkert också vad dessa rader gör för något:

$varde =~ tr/+/ /;
$varde =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$varde =~ s/<!--(.|\n)*-->//g;
Dessa ser till att göra om den information som skickats till ett korrekt format. Du har säkert märkt att data du skickar via formulär, t.ex. då man söker med en söktjänst, i vissa fall visas i adressfältet. Fast många tecken omvandlas till en något mer kryptisk kod än vad du skrev.
Några exempel:
Perl är kul!	==> Perl+%E4r+kul%21
"Hej då", sa han.	==> %22Hej+d%E5%22%2C+sa+han.
åäö ÅÄÖ		==> %E5%E4%F6+%C5%C4%D6
"1+1" är 2	==> %221%2B1%22+%E4r+2
30% av $5 (=$1.5)	==> 30%25+av+%245+%28%3D%241.5%29
För tydlighetens skull har jag markerat de omvandlade tecknena. När man läser in formulärdatat är det alltså dessa tecken man läser in. Därför måste man omvandla allt detta till vanliga tecken innan man låter scriptet bearbeta datat.
Så kort och gott kan man säga att man "fixar till" det som finns i variabeln $varde.

Nedan visas vad raderna gör:

	#Alla plustecken (+) blir till mellanslag.
$varde =~ tr/+/ /;

	#Alla Escape-koder blir till vanliga tecken,
	#dvs. de tecken man skrivit då man postade formuläret.
$varde =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

	#Detta kan tas bort utan problem.
	#Det den gör är att radera allt mellan ett eventuellt
	#<!-- och --> (även själva <!-- och --> tas bort).
	#I många fall kan detta vara oönskat, fast i andra fall högst nödvändigt.
$varde =~ s/<!--(.|\n)*-->//g;

Vi ska nu göra om samma script, fast den här gången ska vi använda metoden GET (informationen lagras i adressfältet och finns kvar om man t.ex. bookmarkar sidan).
Formuläret på valfri sida:
<FORM ACTION="scriptet.pl" METHOD="get">
Din hemsida: <INPUT TYPE="text" NAME="url">
<INPUT TYPE="submit" VALUE="Skicka information">
</FORM>

Scriptet:
#!/usr/bin/perl

sub hamta_get
{

if ($ENV{'QUERY_STRING'} ne '')				# Om det finns något bakom ? i adressfältet
{
	$minnet = "$ENV{'QUERY_STRING'}";			# Allt efter ? i adressfältet lagras i $minnet
	@delar = split(/&/, $minnet);			# $minnet splitras till en array
	foreach $info (@delar)				# Letar genom arrayens alla delar
	{
		($namn, $varde) = split(/=/, $info);	# I detta script: namn=url; varde=det man fyllt i
		# Un-Webify plus signs and %-encoding
		$varde =~ tr/+/ /;
		$varde =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$varde =~ s/<!--(.|\n)*-->//g;
		$GET{$namn} = $varde;			# Informationen lagras i hashen GET
	}
}
}

&hamta_get;					# Anropar hamta_get

if ($GET{'url'})				# Om url finns i hashen GET
{
$url= "$GET{'url'}";				# Så lagras den i variabeln url
}

print "Content-type:text/html\n\n";
print "Din <A HREF=\"$url\">hemsida</A> är fin. :)";

Utmatning (om inmatning: http://www.JavaScript.nu/):
Din <A HREF="http://www.JavaScript.nu/">hemsida</A> är fin. :)";
Nu har du lärt dig hur du tar emot data från GET och POST. Frågan är bara, vilken bör man använda?
På t.ex. söktjänster är GET bäst, eftersom man då kan bookmarka sidan med det sökord man använt. Sidor där man t.ex. skickar en kod bör ha POST, för vem vill att känslig information ska visas i adressfältet och även finnas kvar i webbläsarens cache? Även gästböcker bör ha POST, så att inte inläggen som postas visas i adressfältet.

[Perl guiden] - [Till kapitel 7]






Copyright © Omid Rouhani 1997-2010; Alla rättigheter reserverade.
Guider: [ HTML guide ] - [ JavaScript guide ] - [ DHTML guide ] - [ Perl guide ] - [ Sitemap ]