ioProgrammo N°7, Settembre 1997 ©Copyright DIEMME Editori
http://localhost/cgi-bin/isindex.cgi?uno+due+treLo script sarà molto semplice. Si dovrà soltanto estrarre gli argomenti dall'array @ARGV.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
if (@ARGV > 0) {
print "<ol>\n";
foreach $chiave (@ARGV) {
print "<li>$chiave\n";
}
print "</ol>\n";
}
print "<isindex>\n";
Gli ultimi due casi si adattano rispettivamente ai metodi GET e POST.
http://localhost/cgi-bin/modulo.cgi?nome=pinco&eta=20&indirizzo=via+roma+1Ecco perché serve una libreria di parsing che in sostanza decodifica il contenuto di QUERY_STRING.
print "Content-type: tipo/sottotipoMIME\n\n";Nel caso quindi che il mio cgi restituisca una pagina html, l'istruzione sarà
print "Content-type: text/html\n\n";seguita da una serie di print di tag html. Se invece volessi restituire solo testo, dovrei scrivere
print "Content-type: text/plain\n\n";seguito da alcuni print di testo semplice. Infine se avessi bisogno di inviare al browser un documento non presente sul server in cui gira il mio programma cgi, dovrei scrivere
print "Location: http://indirizzo/pagina.html\n\n";Quest'ultima istruzione può essere usata anche per riferirsi a documenti locali usando come indirizzo la stringa localhost o semplicemente il path di una directory locale, purché sia vista dal server web. Si noti sempre il doppio \n alla fine della prima istruzione print: non ce ne dimentichiamo perché è fondamentale.
#!/usr/bin/perl
require "cgi-lib.pl";
&ReadParse;
print "Content-type: text/html\n\n";
if (%in) {
print "<ol>\n";
foreach $chiave (split(' ',(keys(%in)) [0])) {
print "<li>$chiave\n";
}
print "</ol>\n";
}
che verrà caricato da Netscape con http://localhost/cgi-bin/islib.cgi?uno+due+tre
<A HREF="http://localhost/imgmap.pl"> <IMG SRC="immagine.gif" ISMAP> </A>e poi si sfrutta cgi-lib.pl per recuperare i valori di x e y
#!/usr/bin/perl
require "cgi-lib.pl";
&ReadParse;
print "Content-type: text/plain\n\n";
($x,$y)=split(',',(keys(%in)) [0]);
print "$x, $y\n";
Per motivi di spazio l'esempio è volutamente limitato. Le coordinate x e y si dovrebbero usare con delle istruzioni if in modo da ottenere una certa risposta in base al punto dell'immagine su cui si clicca.
<HTML> <HEAD> <TITLE>Modulo</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="http://localhost/cgi-bin/modulo.cgi"> <FONT SIZE=10><B>Io</B><FONT SIZE=5> e <FONT SIZE=10><B>Linux</B></FONT> <HR><P> Nome: <INPUT TYPE="text" NAME="nome" VALUE="" SIZE=20 MAXLENGTH=30> Eta': <INPUT TYPE="text" NAME="eta" VALUE="" SIZE=2 MAXLENGTH=2><P> Utilizzo Linux per: <SELECT NAME="uso"> <OPTION SELECTED>Hobby <OPTION>Studio <OPTION>Lavoro <OPTION>Altro </SELECT><P> Cosa penso di Linux?<BR> <TEXTAREA NAME="penso" VALUE="" COLS=40 ROWS=2></TEXTAREA><P> Stampo i dati? <INPUT TYPE="radio" NAME="stampo" VALUE="si" CHECKED><I>Si</I> <INPUT TYPE="radio" NAME="stampo" VALUE="no"><I>No</I><P> <INPUT TYPE="submit" NAME="ok" VALUE="OK"> <INPUT TYPE="reset" NAME="cancel" VALUE="Annulla"> </FORM> </BODY> </HTML>
Editiamo le righe precedenti nel file modulo.html e lo salviamo nella DocumentRoot (la directory che contiene tutte le pagine html pubbliche) del server. Ora lo possiamo aprire con Netscape.
Successivamente si passa alla scrittura del codice Perl.
Lo script è composto da tre subroutine principali: &Controlli, che esegue un controllo sui principali errori di compilazione del modulo;
&StampaModulo, usata per restituire il modulo compilato al client
in modo che l'utente possa stamparlo; &InviaModulo, che spedisce via e-mail i dati a colui che ha predisposto il form.
#!/usr/bin/perl
require "cgi-lib.pl";
&ReadParse(*CGI);
&Controlli;
if ( $CGI{"stampo"} eq "si" ) {
&StampaModulo;
}
&InviaModulo;
sub Controlli {
Ecco il primo if che controlla se il campo "nome" contiene qualcosa. In caso negativo verrà restituito un messaggio di errore
if ( $CGI{"nome"} eq "" ) {
&Errore("Non hai inserito il tuo nome");
exit;
}
Qui invece con una semplice espressione regolare si verifica se il nome immesso contiene numeri o caratteri speciali
if ( $CGI{"nome"} !~ /^[a-zA-Z' ]*$/ ) {
&Errore("Il nome non può contenere numeri o caratteri speciali");
exit;
}
Poi si prosegue con i controlli sul campo "eta"
if ( $CGI{"eta"} eq "" ) {
&Errore("Non hai inserito la tua eta'");
exit;
}
if ( $CGI{"eta"} !~ /^[0-9]*$/ ) {
&Errore("L'eta' non può contenere lettere o caratteri speciali");
exit;
}
}
La subroutine &Errore riceve come parametro una stringa contenente il tipo di errore commesso e prepara la pagina html da restituire al client
sub Errore {
local ($errore) = @_;
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD><TITLE>Errore</TITLE></HEAD>\n<BODY bgcolor=#ffffff>\n";
print "<H1 align=center>Errore nella compilazione del modulo</H1>\n";
print "<H2 align=center>$errore</H1>\n<P align=center>\n";
print "<A HREF=\"http://localhost/modulo.html\">Ritorna al form</A>\n";
print "</BODY>\n</HTML>\n\n";
}
StampaModulo invece invia a Netscape tutti i dati inseriti nel form, ma solo nel caso in cui l'utente abbia scelto l'opzione "Si" alla richiesta "Stampo i dati?".
sub StampaModulo {
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n";
print "<TITLE>Modulo</TITLE>\n";
print "</HEAD>\n";
print "<BODY bgcolor=#ffffff>\n";
print "<H1 align=center>MODULO INVIATO!</H1>\n
<FONT SIZE=10><B>Io</B><FONT SIZE=5> e <FONT SIZE=10><B>Linux</B></FONT>\n
<HR><P>\n
<B>Nome: </B>$CGI{\"nome\"}<P>\n
<B>Eta': </B>$CGI{\"eta\"}<P>\n
<B>Utilizzo Linux per: </B>$CGI{\"uso\"}<P>\n
<B>Cosa penso di Linux:</B><P>\n";
foreach (split("\0", $CGI{"penso"})) {
s/\n/<br>\n/g;
print "$_\n";
}
print "</BODY>\n</HTML>\n\n";
}
Lo script si conclude con una chiamata al programma sendmail per inviare via posta elettronica i dati del modulo. Supponendo che sia stato root a predisporre il servizio cgi la mail sarà quindi inviata a root@localhost. Per finire si noti il controllo sull'esecuzione del comando sendmail con la funzione die.
sub InviaModulo {
$sendmail = "/usr/bin/sendmail -bs -i";
open (EMAIL, "|$sendmail >/dev/null") || die "Cannot exec mail command";
print EMAIL "mail from: modulo.cgi\n";
print EMAIL "rcpt to: root\@localhost\n";
print EMAIL "data\n";
print EMAIL "From: modulo.cgi\n";
print EMAIL "To: root\@localhost\n";
print EMAIL "Subject: Io e Linux\n\n\n";
print EMAIL "Nome: $CGI{\"nome\"}\n\n";
print EMAIL "Eta': $CGI{\"eta\"}\n\n";
print EMAIL "Utilizzo Linux per: $CGI{\"uso\"}\n\n";
print EMAIL "Cosa penso di Linux:\n";
print EMAIL "$CGI{\"penso\"}\n";
print EMAIL ".\n";
print EMAIL "quit\n";
close (EMAIL);
}
Salviamo lo script modulo.cgi nella directory /cgi-bin del server e con un chmod 755 modulo.cgi daremo la possibilità a tutti gli utenti di eseguirlo.
Data creazione HTML: Febbraio 1998
Autore: Francesco Munaretto
E-mail: NoSpam@thank.you