Here's an online order form I built for one of my clients. It uses DBF type databases to retrieve user info. Give me a shout if I can help further: patrick@thevegasidea.com
#!/usr/bin/perl -w
use DBI;
use CGI;
use CGI qw(param);
use CGI qw

standard);
use CGI::Carp qw(fatalsToBrowser);
use Fcntl ":flock";
my $acct = param("acct"

;
my $logdate = orderdate();
# get directory path for $HOME
$HOME = "/s/websitename.com/httpsdocs/data";
my $filename = "/s/websitename.com/httpsdocs/data/cfile.dbf";
open FILE, ">>$filename" or die "Cannot open datafile: $!\n";
flock FILE,LOCK_EX;
my $dbh = DBI->connect("dbi:XBase:$HOME"

or die $DBI::errstr;
my $sel = "select * from cfile where acct = ?";
my $sth = $dbh->prepare($sel) or die $dbh->errstr();
# execute the SQL statement with previously declared variables
$sth->execute($acct) or die $sth->errstr();
close FILE;
my @row = $sth->fetchrow_array;
###############################################
# place query results into array as follows
# $row[0] = acct $row[9] = phone
# $row[1] = fname $row[10] = email
# $row[2] = lname $row[11] = gender
# $row[3] = address $row[12] = age (age range)
# $row[4] = city $row[13] = orig_date (date record originated)
# $row[5] = st $row[14] = first_time (if 'n', user hasn't been here before)
# $row[6] = zip $row[15] = edit_date (date record last updated)
# $row[7] = apo $row[16] = loyalbuck
# $row[8] = areacode
my $org_date = substr($row[12],1,10);
# define variables for html page
my $css = "
my $js1 = "
my $img1 = "
#120x75
my $img2 = "
#78x50
my $img3 = "
my $img4 = "
#147x65
my $img5 = "
#400x100
my $img6 = "
#250x40
my $action1 = "
my $action2 = "
my $action3 = "
my $action4 = "
my $action5 = "
my $action6 = "
my $action7 = "
my $action8 = "
my $lb; # loyalbuck value
if ($row[16] eq ""

{
$lb = 0;}
else{
$lb = $row[16];}
# HTML page
print "Content-type: text/html\n\n";
print <<EOF;
<HTML>
<HEAD>
<META http-equiv="Pragma" content="no-cache">
<TITLE>Stay Tuned Re-Order Form</TITLE>
<SCRIPT SRC="$js1" TYPE="text/javascript"></SCRIPT>
<LINK rel="stylesheet" href="$css" type="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF" LINK="#1E7600" MARGINWIDTH="0" onLoad="couponPop()">
<TABLE WIDTH="760" BORDER="0" CELLPADDING="0" CELLSPACING="0" ALIGN="center">
<TR><TD VALIGN="top"><IMG SRC="$img1" WIDTH="120" HEIGHT="75" BORDER="0"></TD><TD ALIGN="center"><IMG SRC="$img5" WIDTH="400" HEIGHT="100" BORDER="0"></TD><TD ALIGN="right" VALIGN="top"><IMG SRC="$img3" WIDTH="42" HEIGHT="1" BORDER="0" ALIGN="left"><IMG SRC="$img2" WIDTH="78" HEIGHT="50" ALT="This is a safe and secure area!" BORDER="0"></TD></TR>
</TABLE>
<HR SIZE="1" WIDTH="85%" NOSHADE>
<FORM METHOD="post" ACTION="$action8 " NAME="frm" onSubmit="return orderValid(this);">
<TABLE WIDTH="500" BORDER="0" CELLPADDING="1" CELLSPACING="0" ALIGN="center">
<TR><TD CLASS="y">First Name:</TD><TD CLASS="z">$row[1]</TD><TD CLASS="y">Account Nbr:</TD><TD CLASS="z">$row[0]</TD></TR>
<TR><TD CLASS="y">Last Name:</TD><TD CLASS="z">$row[2]</TD><TD CLASS="y">Customer Since:</TD><TD CLASS="z">$org_date</TD></TR>
<TR><TD CLASS="y">Address:</TD><TD CLASS="z">$row[3]</TD><TD CLASS="y">Telephone:</TD><TD CLASS="z">$row[8]-$row[9]</TD></TR>
<TR><TD CLASS="y">City:</TD><TD CLASS="z">$row[4]</TD><TD CLASS="y">Email Address:</TD><TD CLASS="z">$row[10]</TD></TR>
<TR><TD CLASS="y">State:</TD><TD CLASS="z">$row[5] <SPAN><FONT CLASS="z">Zip Code:</FONT></SPAN> $row[6]</TD><TD CLASS="y">Loyal Dollars:</TD><TD CLASS="z">$lb</TD></TR>
<TR><TD CLASS="y">APO/AFO Address:</TD><TD CLASS="z">$row[7]</TD></TR>
<TR><TD>
<INPUT TYPE="hidden" NAME="acct" VALUE="$acct">
<INPUT TYPE="hidden" NAME="fname" VALUE="$row[1]">
<INPUT TYPE="hidden" NAME="lname" VALUE="$row[2]">
<INPUT TYPE="hidden" NAME="address" VALUE="$row[3]">
<INPUT TYPE="hidden" NAME="city" VALUE="$row[4]">
<INPUT TYPE="hidden" NAME="st" VALUE="$row[5]">
<INPUT TYPE="hidden" NAME="apo" VALUE="$row[7]">
<INPUT TYPE="hidden" NAME="zip" VALUE="$row[6]">
<INPUT TYPE="hidden" NAME="areacode" VALUE="$row[8]">
<INPUT TYPE="hidden" NAME="phone" VALUE="$row[9]">
<INPUT TYPE="hidden" NAME="email" VALUE="$row[10]">
<INPUT TYPE="hidden" NAME="loyaldollar" VALUE="$row[16]">
</TD></TR>
</TABLE>
<HR SIZE="1" WIDTH="85%" NOSHADE>
<P>
<TABLE WIDTH="600" BORDER="1" CELLPADDING="2" CELLSPACING="0" ALIGN="center">
<TR><TD CLASS="y" ALIGN="center">Item No.</TD><TD CLASS="y" ALIGN="center">Qty</TD><TD CLASS="y" ALIGN="center">Product Description</TD><TD CLASS="y" ALIGN="center">Price</TD><TD CLASS="y" ALIGN="center">Sub-Total</TD></TR>
<TR><TD CLASS="z" ALIGN="center">701</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="qty" SIZE="1" MAXLENGTH="3" CLASS="d" onBlur="calcSale();"></TD><TD CLASS="z"><SPAN><FONT CLASS="y">Stay Tuned</FONT></SPAN> - <SPAN><FONT CLASS="t">Nature's True Body Deodorant</FONT></SPAN> 30 capsules </TD><TD CLASS="z" ALIGN="center">\$19.95</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="itmttl" SIZE="6" READONLY CLASS="d" onFocus="javascript:document.frm.subttl.focus();"></TD></TR>
<TR><TD COLSPAN="3" ROWSPAN="6" VALIGN="top" CLASS="c" ALIGN="right">
<IMG SRC="$img3" WIDTH="1" HEIGHT="29" BORDER="0"><BR>Loyal Dollar Rewards are automatically deducted <BR><IMG SRC="$img3" WIDTH="1" HEIGHT="38" BORDER="0"><BR>State sales tax applies to Nevada Residents only
</TD>
<TD CLASS="c" ALIGN="center">Sub-Total</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="subttl" SIZE="6" READONLY CLASS="d" onFocus="javascript:document.frm.loyalbucks.focus();"></TD></TR>
<TR><TD CLASS="c" ALIGN="center" NOWRAP>Loyal Dollars</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="loyalbucks" SIZE="6" READONLY CLASS="d" onFocus="javascript:document.frm.coupon.focus();"></TD></TR>
<TR><TD CLASS="c" ALIGN="center" NOWRAP>Coupons</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="coupon" SIZE="6" READONLY CLASS="d" onFocus="javascript:document.frm.nv_tax.focus();"></TD></TR>
<TR><TD CLASS="c" ALIGN="center">7¼% Sales Tax</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="nv_tax" SIZE="6" READONLY CLASS="d" onFocus="javascript:document.frm.loyalbucks.focus();"></TD></TR>
<TR><TD CLASS="c" ALIGN="center">S & H</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="sh" SIZE="6" READONLY CLASS="d" VALUE="3.85" onFocus="javascript:document.frm.grandttl.focus();"></TD></TR>
<TR><TD CLASS="y" ALIGN="center">Total</TD><TD ALIGN="center"><INPUT TYPE="text" NAME="grandttl" SIZE="6" READONLY CLASS="d" onFocus="javascript:document.frm.cctype[0].focus();"></TD></TR>
</TABLE>
<TABLE WIDTH="380" BORDER="0" CELLPADDING="1" CELLSPACING="0" ALIGN="center">
<TR><TD HEIGHT="10"></TD></TR>
<TR><TD COLSPAN="2" ALIGN="center"><A HREF="javascript:mySubmit();"><IMG SRC="$img6" WIDTH="250" HEIGHT="40" BORDER="0"></A></TD></TR>
<TR><TD HEIGHT="10"></TD></TR>
<TR><TD COLSPAN="2" CLASS="a" ALIGN="center">Credit Card Information</TD></TR>
<TR><TD HEIGHT="5"></TD></TR>
<TR><TD CLASS="y" COLSPAN="2" NOWRAP><INPUT TYPE="radio" NAME="cctype" VALUE="Visa">  Visa <INPUT TYPE="radio" NAME="cctype" VALUE="MasterCard">  MasterCard <INPUT TYPE="radio" NAME="cctype" VALUE="Discover">  Dscover <INPUT TYPE="radio" NAME="cctype" VALUE="Amer Exp"> American Express</TD></TR>
<TR><TD CLASS="y" NOWRAP>Card Number:</TD><TD NOWRAP><INPUT TYPE="text" NAME="cd_nbr" SIZE="30" CLASS="d"></TD></TR>
<TR><TD CLASS="y" NOWRAP>Exp. Date:</TD><TD CLASS="z"><B>Month:</B> <SELECT NAME="exp_mo" CLASS="c"><OPTION SELECTED VALUE=""><OPTION VALUE="01">01<OPTION VALUE="02">02<OPTION VALUE="03">03<OPTION VALUE="04">04<OPTION VALUE="05">05<OPTION VALUE="06">06<OPTION VALUE="07">07<OPTION VALUE="08">08<OPTION VALUE="09">09<OPTION VALUE="10">10<OPTION VALUE="11">11<OPTION VALUE="12">12</SELECT> <SPAN><FONT CLASS="f">Year:</FONT></SPAN> <SELECT NAME="exp_yr" CLASS="c"><OPTION SELECTED VALUE=""><OPTION VALUE="2002">2002<OPTION VALUE="2003">2003<OPTION VALUE="2004">2004<OPTION VALUE="2005">2005<OPTION VALUE="2006">2006<OPTION VALUE="2007">2007<OPTION VALUE="2008">2008<OPTION VALUE="2009">2009<OPTION VALUE="2010">2010<OPTION VALUE="2011">2011<OPTION VALUE="2012">2012<OPTION VALUE="2013">2013<OPTION VALUE="2014">2014<OPTION VALUE="2015">2015<OPTION VALUE="2016">2016<OPTION VALUE="2017">2017<OPTION VALUE="2018">2018<OPTION VALUE="2019">2019<OPTION VALUE="2020">2020</SELECT></TD></TR>
<TR><TD CLASS="y" NOWRAP>Card ID Nbr:</TD><TD NOWRAP><INPUT TYPE="test" NAME="cvn" SIZE="4" CLASS="d"> <A HREF="javascript

opIt();" CLASS="e">what is this?</A></TD></TR>
<TR><TD CLASS="y" NOWRAP>Name on Card:</TD><TD NOWRAP><INPUT TYPE="text" NAME="cd_name" SIZE="30" CLASS="d"></TD></TR>
<TR><TD HEIGHT="10"></TD></TR>
</TABLE>
<TABLE WIDTH="645" BORDER="0" CELLPADDING="0" CELLSPACING="0" ALIGN="center">
<TR><TD HEIGHT="25"></TD></TR>
<TR><TD ALIGN="center"><INPUT TYPE="submit" VALUE="Submit My Order" CLAS="b"><IMG SRC="$img3" WIDTH="125" HEIGHT="1" BORDER="0"><INPUT TYPE="reset" VALUE="Clear Form" CLASS="b"></FORM></TD></TR>
</TABLE></FORM>
<HR SIZE="2" WIDTH="85%" NOSHADE>
<TABLE WIDTH="645" BORDER="0" CELLPADDING="0" CELLSPACING="0" ALIGN="center">
<TR><TD ALIGN="center" CLASS="c" WIDTH="10" VALIGN="top">**</TD><TD CLASS="c">Even though this page is secured by 128 bit encryption, you may feel more comfortable by mailing or faxing your order. Complete this form and <A HREF="javascript

rtOrderPop();">click here</A> to print your order and then fax or mail the form to our offices.</TD></TR>
</TABLE>
<IMG SRC="$img3" WIDTH="1" HEIGHT="50" BORDER="0"><BR>
<TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0">
<TR><TD ALIGN="center"><A HREF="$action2" CLASS="i">Giveaway Program</A> | <A HREF="$action3" CLASS="i">Loyal Dollars</A> | <A HREF="$action4" CLASS="i">Referrals</A> | <A HREF="$action5" CLASS="i">Order Status</A> | <A HREF="$action6" CLASS="i">Account Manager</A> | <A HREF="$action7" CLASS="i">Main Menu</A></TD></TR>
<TR><TD><HR SIZE="1" WIDTH="100%" ALIGN="LEFT"></TD></TR>
<TR><TD CLASS="c"><I>Copyright©1999-2002 TVI Distribution Company <A HREF="$action1">Legal Notice</A><BR>Last Updated Mon, Aug 5th, 2002</TD></TR>
</TABLE>
</BODY>
</HTML>
EOF
sub orderdate(){
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my ($mo,$dy,$yr,$hr,$mn,$sc,$x);
$x = $mon + 1;
if ($x < 10) {$mo = "0$x";}
else{
$mo = $x;}
if ($mday < 10) {$dy = "0$mday";}
else{
$dy = $mday;}
if ($hour < 10) {$hr = "0$hour";}
else{
$hr = $hour;}
if ($min < 10) {$mn = "0$min";}
else{
$mn = $min;}
if ($sec < 10) {$sc = "0$sec";}
else{
$sc = $sec;}
$yr = $year + 1900;
return ("$mo/$dy/$yr $hr:$mn:$sc"

;
} There's always a better way...