The Quintessential Resource for Internet Servers logo

internet.com
Join the free
WDVL newsletter!

home

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

Up to => Home / Authoring / Scripting / Tutorial

Instantly look up a "techie" word using Webopedia!!


internet.com
e-commerce
WebDeveloper Network



Copyright 1999 internet.com Corporation. Legal Notices. Privacy Policy.

www.internet.com