SPUG: cgi script template

Richard Anderson starfire at zipcon.net
Tue Jun 27 14:16:34 CDT 2000


I notice you include the CGI.pm module, yet do not use its excellent param()
subroutine to read CGI parameters.  param() is much more robust that parsing
the parameters with your own code; it handles multi-valued parameters
nicely, handles special cases without barfing, and handles weird characters
robustly.

Richard.Anderson at unixscripts.com
www.zipcon.net/~starfire/home (personal)
www.unixscripts.com (corporate)
----- Original Message -----
From: "Joe Devlin" <jdevlin at stadiumdistrict.com>
To: <spug-list at pm.org>
Sent: Tuesday, June 27, 2000 9:49 AM
Subject: RE: SPUG: cgi script template


> This is a shell of a functioning script.
> There are subroutines in Common.pm that we use
> to make are lives easier, but are not included
> here for brevity.
>
>
> #!/usr/bin/perl -w
>
> # # # # # # # # # # # # # # # # # # # # # # # # # # # #
> # File: myquery.pl
> # Written by: Devlin Technical Consulting
> # Tacoma, WA
> #
> # Customer: xxx
> # xxx
> #
> # Description:
> # This query accepts information from the
> # forms ........
> #
> # It enters the data into tables xxxx ......
> #
> # # # # # # # # # # # # # # # # # # # # # # # # # # # #
> # Revision 1 3/5/00 Initial
>
> # Initialize some modules
> use DBI; #datbase interface
> use CGI qw(:all); #creating web pages
> use CGI param; #or this for getting parameters
> use English;
> use diagnostics; #verbose failure codes
> use Common; #Devlin Technical Consulting common commands
> use strict; #must declare global variables
> #here are the globals
> use vars qw( $action $item $dummy $mstate $i $n %form_data
> $form_data $document_root %fields $path
> $filetoopen $dsn $user $password $server_name
> $query_string);
>
>
> # Initialize some variables
> $mstate=param("mstate");#state machine design variable
> $dummy=""; #dummy return value for debug
>
> # # # # # # # # # # # # # # # # # # # # # # # # # # # #
> #Main part of program
>
> ####################################
> # get the data passed from the form
> #get the input from the form by either method
> if ($ENV{'REQUEST_METHOD'} eq "GET")

> $query_string = $ENV{'QUERY_STRING'};
> }
> elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
> read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
> }
> else {
> # Offline mode goes here.
> }
> %form_data=form_to_hash($query_string);
>
>
> ####################################
> # get the directory from which web documents are served
> $document_root = $ENV{'DOCUMENT_ROOT'};
>
> ####################################
> # get the server name hosting this site
> $server_name = $ENV{'SERVER_NAME'};
>
> # # # # # # # # # # # # # # # # # # # # # # # # # # # #
> #Figure out what form (or mstate) just called this script
> # submission of form query by users parameters,
> if ($mstate eq 'query_1')
> {
> &pp_query_1();
> }
> # + + +  + + +  + + +  + + +  + + +  + + +
>
> exit(0);
>
> #Define subroutines
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
> sub pp_query_1{
> #Define some local variables
> my $dbh= my $sth= my $ary_ref= my $account_number= my $query="";
>
> #Pre-process the form data
> #highlight video checked must be Y(es) or N(o) for comparison to the
databse
>
> unless($form_data{'myUsersChoice'} eq "Y"){
> $form_data{'myUsersChoice'} = "N";
> }
>
> #Get  login, password, and datasource name
> &get_login_pass_dsn;
>
> #Access the Database
> #my $trace_level=3;#debug only
> #my $h = DBI->trace($trace_level);#debug only
>
> $dbh = DBI->connect($dsn, $user, $password,
>                            { RaiseError => 0, PrintError=> 1})
> or &bail_out("Cannot connect to database");
>
> #issue query: get the account number of the first result
> $query=qq[
>
> SELECT
> table1.field1
> FROM
> table2,
> table3,
> table4
> WHERE
> table.a_field = "$form_data{'a_field'}"];
>
> $sth = $dbh-> prepare ($query)
> or &bail_out("Cannot prepare query");
> $sth->execute ()
> or &bail_out("Cannot execute query");
>
> #read the results of the query: account number of first match
> $account_number = $sth->fetchrow_array();
>
> #Check the results
> if ($account_number==undef)
> {&bail_out("No results found during retrieval.");}
>
> $sth->finish ()
> or &bail_out("Cannot finish query");
>
> $dbh->disconnect
> or &bail_out("Cannot disconnect from database");
>
> #okay the query was successful, display the results
> &print_frameset($account_number);
>
> }# end of sub pp_query_1
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
>
>
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
> sub bail_out{
> my $message = shift;
> my $filetoopen = "/search/query_fail_template.html";
>
> %fields = (
> error_message=>"$message"
> );
> print "Content-type: text/html\n\n";#must preceed print template command
> print template( "$document_root" . "$filetoopen", \%fields);
> die "Bailed out ....";
> }
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
> # + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + +  + + #
> #
>
>
>
>
> ----------
> From: jeff[SMTP:jeff at planetoid.net]
> Sent: Monday, June 26, 2000 2:51 PM
> Cc: spug-list at pm.org
> Subject: SPUG: cgi script template
>
> is the following a good template for develping perl/cgi/db applications?
>
> #!/usr/bin/perl
>
> use stuff/config
>
> eval {
>     connect to db
>     do some stuff
> };
>
> if ($@)
>     error reporting
> }
>
> exit 0;
>
> or does defining a sig die handler improve readability or exception
> handling...
>
> jeff at planetoid.net
>
>
>
>  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>      POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
>  Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/
>  For Subscriptions, Email to majordomo at pm.org:  ACTION  spug-list  EMAIL
>   Replace ACTION by subscribe or unsubscribe, EMAIL by your Email address
>
>
>
>
>
>  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>      POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
>  Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/
>  For Subscriptions, Email to majordomo at pm.org:  ACTION  spug-list  EMAIL
>   Replace ACTION by subscribe or unsubscribe, EMAIL by your Email address
>
>
>


 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
 Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/
 For Subscriptions, Email to majordomo at pm.org:  ACTION  spug-list  EMAIL
  Replace ACTION by subscribe or unsubscribe, EMAIL by your Email address





More information about the spug-list mailing list