eXtropia: the open web technology company
Technology | Support | Tutorials | Development | About Us | Users | Contact Us
Resources
 ::   Tutorials
 ::   Presentations
Perl & CGI tutorials
 ::   Intro to Perl/CGI and HTML Forms
 ::   Intro to Windows Perl
 ::   Intro to Perl 5
 ::   Intro to Perl
 ::   Intro to Perl Taint mode
 ::   Sherlock Holmes and the Case of the Broken CGI Script
 ::   Writing COM Components in Perl

Java tutorials
 ::   Intro to Java
 ::   Cross Browser Java

Misc technical tutorials
 ::   Intro to The Web Application Development Environment
 ::   Introduction to XML
 ::   Intro to Web Design
 ::   Intro to Web Security
 ::   Databases for Web Developers
 ::   UNIX for Web Developers
 ::   Intro to Adobe Photoshop
 ::   Web Programming 101
 ::   Introduction to Microsoft DNA

Misc non-technical tutorials
 ::   Misc Technopreneurship Docs
 ::   What is a Webmaster?
 ::   What is the open source business model?
 ::   Technical writing
 ::   Small and mid-sized businesses on the Web

Offsite tutorials
 ::   ISAPI Perl Primer
 ::   Serving up web server basics
 ::   Introduction to Java (Parts 1 and 2) in Slovak

 

introduction to web programming
state maintenance  
Self-referntial 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 stateles protocol, a CGI script has no memory of previous connections. Thus, if you want to refer back to a script 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>!;
  }

Previous | Next | Table of Contents