Download this (Unix text) file
#!/usr/bin/perl -w # Show a postcard from the postcards table in the hcc database # using CGI, Perl, and DBI. # # (C)1999 by Wayne Pollock, Tampa Florida USA. All Rights Reserved. # # Adapted by Wayne Pollock from an article in "Linux Journal", October 1997 # (Issue #42), pp. 106-111, "Integrating SQL with CGI, Part 1" by # Reuven M. Lerner. The Linux Journal is published by SSC, Inc., Seattle, WA. # For reprint permissions contact linux@ssc.com. # Correct use of this CGI script is to display an HTML form, where the # action URL of this script. The form should have a single input field, # "keywords", which should be an ID number for a postcard, e.g., "12345". # # Note the use of the HTML tag " " as a quick-and-dirty form! # Show which modules to use: (Perl has literally hundreds of modules!) use strict; use diagnostics; use CGI; use DBI; # Define the database we want to talk to: # (Syntax: DBI: : : : # where is 'mysql', is 'hcc', # and the and are optional (defaults to the # standard port on 'localhost' if omitted). Note that mySQL # comes "out of the box" with a "test" database that has # no security restrictions. To use it, create a table 'postcards' # and change "hcc" to "test". my $db = 'DBI:mysql:hcc'; # Define the directory where the graphic files are # (Relative to the DocumentRoot of the web server): my $graphics_dir = "/graphics"; # Declare some global variables: my ($sender_name, $sender_email, $recipient_name, $graphic_name, $postcard_text) = ("", "", "", "", ""); # Create a CGI object: my $cgi = new CGI; # Send the content type header for the reply: (This is always the same # whether we return the postard or an error message.) print $cgi->header( "text/html" ); # Get the postcard ID number from the form data: (If missing, # $id will be set to undef.) my $id = $cgi->param( "keywords" ); if ( (not defined $id) or ($id =~ /\D+/) ) { print $cgi->start_html( -title => "Enter Postcard ID" ); print " Please provide a postcard ID number in order "; print "to fetch a card!\n"; print "
\n"; print $cgi->end_html; exit; } # Connect to the database (via sockets): (dbh: DataBase Handle) # (The arguments to connect are database, username, password. # The last two arguments are optional and default to 'undef'.) my $dbh = DBI->connect( $db, 'www', '' ) or die "Error on connect, DB=\"$db\": $DBI::errstr ($DBI::err)"; # Create the SQL Query: my $sql = "select sender_name, sender_email, "; $sql .= "recipient_name, graphic_file, "; $sql .= "postcard_text from postcards, graphics "; $sql .= "where id_number = $id and graphic_id = graphics.id"; # Create the SQL Statement: (sth: STatement Handle) my $sth = $dbh->prepare( "$sql" ) or die "Error on prepare, SQL=\"$sql\": $DBI::errstr ($DBI::err)"; # Execute the query, and make sure it worked: $sth->execute or die "ERROR with SQL command \"$sql\" on \"$db\": $sth->errstr ($sth->err)"; # Report an error if no rows (or more than one row) of data are returned: if ( $sth->rows != 1 ) { print $cgi->start_html( -title => "Invalid Postcard ID!" ); print " The ID number you provided does not match any postcard "; print "currenlty in the hcc database. Please try again.\n"; print "
\n"; print $cgi->end_html; exit; } # Fetch the data from the returned result set into variables: ($sender_name, $sender_email, $recipient_name, $graphic_name, $postcard_text) = $sth->fetchrow; # Send the results back as HTML: print $cgi->start_html( -title => "Postcard for $recipient_name" ); print "Message from $sender_name "; print "($sender_email): \n"; print " $postcard_text\n"; print "
Sent through the HCC.COM postcard system. \n"; print "Why not send your own postcard?
\n"; print "©1999 by HCC.COM. All Rights Reserved.\n"; print "
Contact: "; print ( 'webmaster@hcc.com', "\n" ); print $cgi->end_html; # Clean up the statement handle (release memory): $sth->finish; # Disconnect fron the database: $dbh->disconnect; # All done, time to exit Perl: exit;