|
Maintaining State
Maintaining State
- Self-referential
scripts are very cool
and extremely common. However, they do introduce some
complexities to your application.
- One of the most subtle problems
introduced by self-referential scripts is the fact that since
HTTP is a stateless
protocol,
a CGI script has no memory of
previous connections. Thus, if you want to refer back to a
script for a second, the data from the first refernce will be
lost.
- However, you can programmatically give
your CGI script memory by saving state in the form of hidden form
variables.
- In other words, you will make sure that
all of the form data from one request gets passed to following
requests via the HIDDEN form tag.
- Consider the following code which does
just this:
#!/usr/local/bin/perl
require "cgi-lib.pl";
&ReadParse(*form_data);
print "Content-type: text/html\n\n";
// Print out form if this is the
// users's first request. You've seen
// this already!
if ($form_data{'submit'} eq "")
{
print qq!
<HTML>
<HEAD>
<TITLE>Testing Form Input</TITLE>
</HEAD>
<BODY>
<FORM METHOD = "POST"
ACTION = "self-refer.cgi">
<CENTER>
<TABLE BORDER = "1">
<TR>
<TH>First Name</TH>
<TD><INPUT TYPE = "text"
NAME = "f_name"></TD>
</TR>
<TR>
<TH>Last Name</TH>
<TD><INPUT TYPE = "text"
NAME = "l_name"></TD>
</TR>
<TR>
<TH>Email</TH>
<TD><INPUT TYPE = "text"
NAME = "email"></TD>
</TR>
</TABLE>
<P>
<INPUT TYPE = "SUBMIT" NAME = "submit"
VALUE = "submit">
</CENTERv
</FORM>
</BODY>
</HTML>!;
exit;
}
// If the user has entered
// only first name,
// last name and email, let's
// get phone number
// to. But we must make sure
// that we save the
// values for first nme, last
// name and email
// as hidden form tags.
elsif ($form_data{'submit'} eq "submit")
{
print qq!
<HTML>
<HEAD>
<TITLE>Get More Data While
Remembering Old</TITLE>
</HEAD>
<BODY>
You submitted the following information:
<P>
<TABLE BORDER = "1">!;
foreach $key (keys(%form_data))
{
print qq!
<TR>
<TD>$key</TD>
<TD>$form_data{$key}</TD>
</TR>!;
}
// Here is where we ask for the
// phone number
print qq!
</TABLE>
<P>
Thank you very much. However, we need
one more bit of information.
Please input your phone number below:
<P>
<FORM METHOD = "POST" ACTION = "self-refer.cgi"v
<INPUT TYPE = "TEXT" NAME = "phone">!;
// Here is were we add the
// hidden variables.
// Note that we do not want to
// keep the value
// for "submit" cause we are
// going to create a
// new submit button with a new
// VALUE argument
// so that we know which request
// is coming in.
foreach $key (keys(%form_data))
{
if ($key ne "submit")
{
print qq!
<INPUT TYPE = "HIDDEN" NAME = "$key"
VALUE = "$form_data{$key}">!;
}
}
print qq!
<INPUT TYPE = "SUBMIT" NAME = "submit"
VALUE = "Final Submit">
</FORM>
</BODY>
</HTML>!;
}
// If the user clicked a
// button with "Final Submit"
// then the above routines
// would have both returned
// false and we can assume that
// the user has entered the
// phone number, so we handle it.
else
{
print qq!
<HTML>
<HEAD>
<TITLE>Testing Form Input</TITLE>
</HEAD>
<BODY>
<TABLE>!;
foreach $key (keys(%form_data))
{
print qq!
<TR>
<TD>$key</TD>
<TD>$form_data{$key}</TD>
</TR>!;
}
print qq!
</TABLE>
</BODY>
</HTML>!;
}
Additional Resources:
Self-Referential Scripts
Table of Contents
Exercise Four
| |
|