On Tuesday 08 December 2009 9:50:57 am Adam Jimerson wrote: > On Dec 7, 12:43 pm, g...@lazymountain.com (Greg Jetter) wrote: > > On Sunday 06 December 2009 10:24:31 am Adam Jimerson wrote: > > > I am working on a registration page and there for want it to show the > > > user errors it has found with their input. I have two subroutines in > > > my code, the first one prints out the form, also takes an array with > > > error descriptions that is passed by the other subroutine. The other > > > subroutine takes the user input and verifies it, any errors that it > > > finds it pushes into an array called @errors and passes that back to > > > the first subroutine. The problem is it doesn't work right when I > > > run it from the command line this is what I get: > > > > > > vend...@seserver:~/public_html/AmeriVista> perl -cT register.cgi > > > [Sun Dec 6 14:12:12 2009] register.cgi: Illegal character in > > > prototype for main::form_verify : @user at register.cgi line 43. > > > [Sun Dec 6 14:12:12 2009] register.cgi: Scalar found where operator > > > expected at register.cgi line 93, near "$user" > > > [Sun Dec 6 14:12:12 2009] register.cgi: (Missing semicolon on > > > previous line?) > > > [Sun Dec 6 14:12:12 2009] register.cgi: main::form_verify() called > > > too early to check prototype at register.cgi line 36. > > > Content-type: text/html > > > > > > <h1>Software error:</h1> > > > <pre>syntax error at register.cgi line 93, near "$user" > > > Global symbol "$GoodMail" requires explicit package name at > > > register.cgi line 93. > > > register.cgi had compilation errors. > > > </pre> > > > <p> > > > For help, please send mail to this site's webmaster, giving this error > > > message > > > and the time and date of the error. > > > > > > </p> > > > [Sun Dec 6 14:12:12 2009] register.cgi: syntax error at register.cgi > > > line 93, near "$user" > > > [Sun Dec 6 14:12:12 2009] register.cgi: Global symbol "$GoodMail" > > > requires explicit package name at register.cgi line 93. > > > [Sun Dec 6 14:12:12 2009] register.cgi: register.cgi had compilation > > > errors. > > > > > > I have attached my code for the script, if someone could look at it > > > and give some ideas as to how to make this work or a better way then > > > please do > > > > You are trying to use a local scoped var as a global , line 93 $GoodMail > > is used out of its scope , > > > > if ( $user[5] =~ /^([...@\w.]+)$/ ) { > > $user[5] = $1; > > eval { > > my $GoodMail = Email::Valid->address( -address => > > "$user[5]", -mxcheck => 1); > > return; > > } > > #push @errors, "<p>Error: Double check your email > > address</p>" if $@; $user[5] = $GoodMail; > > } > > > > it should read > > > > if ( $user[5] =~ /^([...@\w.]+)$/ ) { > > my $GoodMail ; > > $user[5] = $1; > > eval { > > $GoodMail = Email::Valid->address( -address => > > "$user[5]", -mxcheck => 1); return; > > } > > #push @errors, "<p>Error: Double check your email > > address</p>" if $@; $user[5] = $GoodMail; > > } > > > > or even declare it up with the other globals if you want , but the way > > you have it now it is out of scope after that eval { } block completes. > > > > there may be other errors , fix that one first and try it again and see > > what else pops up. > > > > have fun > > > > Greg > > Ok well I have corrected a couple more errors with the script and it > now has no errors during compile and runs until it goes to report > problems it has found back to the user: > > #!/usr/bin/perl -T > use warnings; > use strict; > use diagnostics; > use CGI qw(:standard); > use DBI; > use Email::Valid; > BEGIN { > $|=1; > use CGI::Carp('fatalsToBrowser'); > } > delete @ENV { 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; > > my @user; #Here @user deals with: first name, last name, username, > password, CLSCC Email, and Student Number > my @errors; > my $dbh; > > sub db_connect { > use constant username => 'secret'; > use constant password => 'secret'; > my $database = 'database name'; > my $server = 'localhost'; > my $dsn = "DBI:mysql:database=$database;host=$server;port=3306" || > die "Couldn't Connect to the Database: $!"; > my $dbh = DBI->connect($dsn, username, password, {RaiseError > => 1}) || die "couldn't authenticate to the Database: $!"; > } > > db_connect (); > print header; > print start_html (-title=>"AmeriVista Event Logging", > -author=>'vend...@vendion.net'); > print "<h1>Registration Form</h1>\n"; > print "<hr>\n"; > > if (param) { > form_verify (@user); > } else { > print start_form; > print_form (); > print end_form, "\n"; > } > > sub form_verify { > $user[0] = param('FirstName'); > if ( $user[0] =~ /^([-\w.]+)$/ ) { > $user[0] = $1; > } else { > push @errors, "<p>First Names should only contain > letters</p>\n"; > } > $user[1] = param('LastName'); > if ( $user[1] =~ /^([...@\w.]+)$/ ) { > $user[1] = $1; > } else { > push @errors, "<p>Last Name Should Only Contain > Letters</p>\n"; > } > $user[2] = param('Username'); > if ( $user[2] =~ /^([...@\w.]+)$/ ) { > $user[2] = $1; > } else { > push @errors, "<p>Usernames Should Only Contain > Letters and Numbers</p>\n"; > } > $user[3] = param('Password1'); > if ( $user[3] =~ /^([...@\w.]+)$/ ) { > if ( length ( $user[3] ) eq '6' ) { > $user[3] = $1; > if ( length ( $user[3] ) eq '6' ) { > $user[3] = $1; > } else { > push @errors, "<p>The password is to short, it > should be atleast 6 charaters long</p>\n"; > } > } else { > push @errors, "<p>The Password Should only Contain > alphanumeric characters!\n";; > } > $user[4] = param('Password2'); > if ( $user[4] =~ /^([...@\w.]+)$/ ) { > if ( length ( $user[4] eq '6' ) ) { > $user[4] = $1; > } else { > push @errors, "<p>The Password is to > Short, it should be at least 6 charaters long</p>\n"; > } > } else { > push @errors, "<p>The Password Should only Contain > alphanumeric characters!\n"; > } > if ( $user[3] != $user[4] ) { > push @errors, "<p>Error: Passwords do not match!</p>\n"; > } > $user[5] = param('Email'); > if ( $user[5] =~ /^([...@\w.]+)$/ ) { > my $GoodMail; > $user[5] = $1; > eval { > $GoodMail = Email::Valid->address( -address => > "$user[5]", -mxcheck => 1); > return; > }; > push @errors, "<p>Error: Double check your email > address</p>\n" if $@; > $user[5] = $GoodMail; > } else { > push @errors, "<p>Incorrect Email given</p>\n"; > } > $user[6] = param('studentid'); > if ( $user[6] =~ /^([...@.]+)$/ ) { > $user[6] = $1; > } else { > push @errors, "<p>Incorrect studentid given</p>\n"; > } > push @errors, "<p>Incorrect studentid given</p>\n"; > } > if ( @errors ) { > print "Errors found, going back to form\n"; #Debugging > print_form (@errors); > } else { > print "No errors found\n"; > return @user; > } > } > > sub print_form { > my @errors = @_; > print "<div align='center'>\n"; > print "<table width='25%' border=1 summary='Register'>\n"; > print "<td align='left' valign='middle'>\n"; > if ( @errors ) { > while ( @errors ) { > print $_, "\n"; > print "<br>\n"; > } > } > print "<p>Registration</p>\n"; > } > print "<p>Registration</p>\n"; > print "<p>First Name: ", textfield(-name=>'FirstName', > -maxlength=>120), "\n"; > print "<br>\n"; > print "Last Name: ", textfield(-name=>'LastName', > -maxlength=>120), "\n"; > print "<br>\n"; > print "Username: ", textfield(-name=>'Username', > -maxlenght=>120), "\n"; > print "<br>\n"; > print "Password: ", password_field(-name=>'Password1', > -maxlength=>120), "\n"; > print "<br>\n"; > print "Repeat Password: ", password_field(-name=>'Password2', > -maxlength=>120), > "\n"; > print "<br>\n"; > print "CLSCC Email: ", textfield(-name=>'Email', > -maxlenght=>120), "\n"; > print "<br>\n"; > print "Student ID #: N", textfield(-name=>'studentid', > -maxlength=>120), "</p>"; > print submit(-name=>'Submit_Form', > -maxlength=>120), "</p>"; > print submit(-name=>'Submit_Form', > -value=>'Submit'); > print reset, "\n"; > print "</td>\n"; > print "</table>\n"; > print "</div>\n"; > } > > Just submitting a blank form is enough to trigger the problem I have > (see for yourself http://vendion.dyndns.org/cgi-bin/register.cgi), it > looks like the script stops execution or fails once it hits this block > of code: > > if ( @errors ) { > while ( @errors ) { > print $_, "\n"; > print "<br>\n"; > } > } > > According to my browser the page never finishes loading and it starts > to draw the table but never finishes. I don't know if it is because I > am handling the @errors array wrong in the print_form() subroutine > (completely possible, first time doing anything like this in Perl), I > know it has to be that block of code because I can commit it out and > everything works smoothly.
start by checking the content of @errors inside the print_form sub. with a print statement and exit. Greg -- To unsubscribe, e-mail: beginners-cgi-unsubscr...@perl.org For additional commands, e-mail: beginners-cgi-h...@perl.org http://learn.perl.org/