Hi all,
Here is my ammended code, does not work however, can someone help?
Starts okay I get the form, but when I fill the form in I get stuck. Basically all I get is the following messages on the screen:
CREATE NEW USER
Start main block
parameters: ID first_name surname date_of_birth email ejudopass submit button
As you can see the param() function seems to be where the problem is, what am I doing wrong?
Cheers
Lance
#!/usr/bin/perl -w
# ---------------------------------------------
# create-user.cgi - Create by Lance Wicks
# e-judo.sourceforge.net
# This is free open source software! Released under GPL
#
# Description:
# This script adds a new user to the users database
#
# History:
# ========
# 20 December 2003, Lance Wicks - Created initial file.
# 23 December 2003, Lance Wicks - On the suggestion of Jeff Zucker, am
+ re-writing this code to use more sub-routines and some other good su
+ggestions.
my $DEBUG = 1; # If this is set to 1 then we see the debug messag
+es.
# The following 4 lines set strict PERL coding then load the CGI DBI a
+nd DBD::Anydata modules.
# --------------------------------------------------------------------
+-------------------------
use strict; # force strict programming controls
use CGI qw(:standard); # use the CGI.PM module
use lib './MyLib'; # use the modules in MyLib, this is the DBD::Anydat
+a used for database activities
use DBI; # This calls the DBI module, which along with the line above
+allows us to do database activities
# Sub routines
# --------------
sub collect_user_input {
# This routine collects the data entered by the user from
+ the form and adds the initial values and returns the @user_data arra
+y
# -------------------------------------------------------
+--------------
print p("Start of collect_user_input") if $DEBUG;
my @user_data; # initialise the array we will use to sto
+re all these pieces of data
$user_data[0] = param("ID"); # the next few lines alocate
+ the info from the completed form to variables.
$user_data[1] = param("first_name");
$user_data[2] = param("surname");
$user_data[3] = param("date_of_borth");
$user_data[4] = param("email");
$user_data[5] = param("ejudopass");
# now give values to the other user data field variables
$user_data[6] = "NO"; # ($active) the user is not immed
+iately active, we will email them first.
$user_data[7] = "now"; # ($last_login)set the last login
+time to now
$user_data[8] = "now"; #($create_data) set the date we cr
+eated this user to now as well
$user_data[9] = 0; # ($earnings) They have not earned any
+ thing yet so set it to Zero
$user_data[10] = 50; # ($cash) This is their cash on hand
+, lets give them 50 credits by default
$user_data[11] = 1; # ($judoka_limit) They can create 1 J
+udoka
$user_data[12] = 0; # ($sensei_limit) They can NOT create
+ a sensei (YET)
$user_data[13] = 0; # ($dojo_limit) They can not create a
+ Dojo
$user_data[14] = 0; # ($team_limit)They can not create a
+team
$user_data[15] = "Novice"; # ($rank) They are a novice us
+er to start with
return @user_data;
print p("END of collect_user_input") if $DEBUG;
} # end of subroutine collect_user_data
sub validate_user_input {
# This sub routine receives the @user_data ar
+ray from collect_user_input sub-routine, it validates it to make sure
+ it is safe for the database, then return the @user_data array
# -------------------------------------------
+---------------------------------------
print p("Start of validate_user_input") if $D
+EBUG;
my @internal_user_data = @_;
# add some data validation of user input here
return @internal_user_data;
print p("END of validate_user_input") if $DEB
+UG;
} # end of sub routine validate_user_input
sub add_user_input_to_db {
# This routine receives @user_data from validate_user_inp
+ut and then adds it to the Database using SQL
# -------------------------------------------------------
+---------------------------------------------
# Next connect to the database and check if they exist al
+ready.
print p("Start of add_user_input_to_db") if $DEBUG;
my @internal_user_data = @_; # This line takes the user_d
+ata passed to us from the previous routine (@_) and allocates it to o
+ur internal user data array
my $entered_id = $internal_user_data[0]; # just so that
+it is clearer later we create a variable from the passed data
# Use DBI to connect to the users.csv datafile
#-----------------------------------------------
my $dbh = DBI->connect('dbi:AnyData(RaiseError=>1):'); #
+tell DBI we want to use the Anydata module in ./MyLibs
$dbh->func( 'users', 'CSV', 'data/users.csv', 'ad_catalog
+'); # Connect to the users.csv data file
# select from the datafile the id for the user ID from th
+e array paased from the previous sub routine
my $sql = "SELECT id FROM users WHERE id = ?"; # th
+is is the SQL command we want to execute
my @params = ($entered_id); # Th
+eese are the parameteres we will use in the SQL command above
print "$sql\n[@params]\n" if $DEBUG; # if
+ we are in debug mode print the SQL statement
my $sth = $dbh->prepare( $sql ); # pr
+epare the SQL command
$sth->execute( @params ); # ex
+cecute the SQL using our parameters
my @result = $sth->fetchrow_array; # this line takes the
+results of the select and puts it in the array called RESULTS
$dbh->disconnect(); # we are done with the datbase for no
+w, so disconnect from it (MAY NOT BE NECESSARY)
print p("result = @result")if $DEBUG; # Pr
+ints the result of our SQL command if we are in debug mode.
if (@result) { #if the result array is in existence (i
+e we found the username) then...
print p("Sorry this ID is in use a
+lready");
} else {
print p("about to insert the new record")if $D
+EBUG;
# if the user does not exist then add them!
# so connect to the database
my $dbh = DBI->connect('dbi:AnyData(RaiseError
+=>1):'); # tell DBI we want to use the Anydata module in ./MyLibs
$dbh->func( 'users', 'CSV', 'data/users.csv',
+'ad_catalog'); # Connect to the users.csv data file
# add the data into a new record
my $sql = "INSERT INTO users VALUES ( ?,?,?,?,
+?,?,?,?,?,?,?,?,?,?,?,? )"; # this is the SQL command we want t
+o execute
my @params = (@internal_user_data);
+ # Make the parameters those passed to us from the previous rou
+tine (and originally from the user)
print "$sql\n[@params]\n" if $DEBUG;
+ # if we are in debug mode print the SQL statement
my $sth = $dbh->prepare( $sql );
+ # prepare the SQL command
$sth->execute( @params );
+ # excecute the SQL using our parameters
print p("Inserted Record")if $DEBUG;
+ # just a reference in debug mode
}
print p("END of add_user_input_to_db") if $DEBUG;
} # end of sub routine add_user_input_to_db
sub print_user_data_form {
# This subroutine create the user data web pa
+ge which is filled in, the data is then used by other routines.
print p("START of print_user_data_form") if $
+DEBUG;
print hr, start_form; # create a for
+m using CGI.PM
print p("User ID: ", textfield("ID"), " - Thi
+s is the ID you will use to login to the system"); # what user
+name do they want.
print p("First Name: ", textfield("first_name
+"), " - This is your REAL name"); # what is their real name
print p("Surname: ", textfield("surname"), "
+- This is your REAL last name"); # what is their real name
print p("Date of Birth: ", textfield("date_of
+_birth"), " - (DD/MM/YYYY) This is your date of birth, used if you ev
+er need to prove who you are");
print p("Email address: ", textfield("email")
+, " - the email address you would like to use.");
print p("Password: ", password_field("ejud
+opass"), " - Choose a password to use on the system");
print submit(-name=>'submit button');
print end_form, hr;
+ # end the form
print p("END of print_user_data_form") if $DE
+BUG;
} # end of print_user_data_form
# end of subroutines
# -------------------
# main code block
# ---------------
print header(), start_html("e-Judo Test Area"), h1("CREATE NEW USER");
+ # This line uses CGI.PM to to create the webpage
print p("Start main block") if $DEBUG;
print p("parameters: ", param()) if $DEBUG;
print p("no parameters so print the form") if !(param());
if (param()){ # If there is a parameter(or parameters) then validate,
+ else show the login screen.
# the following lines are excecuted if paramaters HAVE
+been entered
my @temp_variable = collect_user_data();
print p("collect user data gave us: @temp_variable") if
+ $DEBUG;
my @temp_variable2 = validate_user_input(@temp_variable
+);
print p("validate user data gave us: @temp_variable2")
+if $DEBUG;
my @temp_variable3 = add_user_input_to_db(@temp_variabl
+e2);
print p("add user data to db gave us: @temp_variable3")
+ if $DEBUG;
} else { # if there are no parameters (the form has not yet be
+en filled in then....
print_user_data_form();
}
print end_html; # this closes the web page properly
print p("End of main block") if $DEBUG;
Kia Kaha, Kia Toa, Kia Manawanui!
Be Strong, Be Brave, Be perservering!