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


Graphics & Media Lab. >> Библиотека | Курсы | Графикон

Hosted by Graphics & Media Lab
http://graphics.cs.msu.su
lab_logo
mailto: Laboratory