--- Lawrence Statton <[EMAIL PROTECTED]> wrote:

> > --0-551411304-1121705388=:507
> > Content-Type: text/plain; charset=iso-8859-1
> > Content-Transfer-Encoding: 8bit
> > 
> > Hi all,
> >  
> > I'm getting an error when trying to do an INSERT
> statement to a MySQL databas
> > e. There's something I'm not understanding here.
> Can anyone point me in the r
> > ight direction? I also tried a "do" method, but
> got the same error. I know th
> > e "param" function is loading the values from the
> form, because I've used a "
> > print" statement to check the variables.
> >  
> > TIA
> > Ron
> >  
> >
> ---------------------snip---------------------------
> > Software error:
> > Can't call method "execute" on an undefined value
> at C:/www/cgi-bin/load_comp
> > any_products.cgi line 21.
> > For help, please send mail to the webmaster
> ([EMAIL PROTECTED]), giving this er
> > ror message and the time and date of the error.
> >
> ---------------------snip---------------------------
> 
> 1) Your first mistake is never checking for any
> errors;
> 
> my $dbh = DBI->conect(...) or
>  die "...helpful error message...";
I was using: 

my $dbh = DBI->connect("DBI:mysql:company",
"geeksatlarge") or die "Error: $DBI::errstr\n";

but will try:

die "no database: ", DBI->errstr unless $DBH;

Thanks!
> 
> Perhaps ESPECIALLY interesting would be around line
> 20 adding
> something of the form
> 
> my $sth = $dbh->prepare($sql) or
>   die "There is no statement handle because: ",
> $dbh->errstr;
>
Yep! I saw a lot of mail on this one. I'm removing the
extra "my". It was an oversight. :-)
 
> 2) Use placeholders.  REALLY -- where the [EMAIL PROTECTED] are
> people learning to 
>    write SQL?
> 
> 3) I have a personal bias against the format of
> insert you have used,
>    and it makes it utterly impossible to help debug
> your code because
>    now a critical piece of data ( the output of a
> DESCRIBE products)
>    is invisible to us.  
> 
>    I always prefer the "INSERT INTO table ( col,
> col, col ) VALUES (
>    ?, ? , ? ) ; form as it handles much more
> gracefully the addition
>    of columns in a table.

Yes, the though had crossed my mind to use this
format, so I'm switching over; also, using
placeholders.

I won't be able to test any corrections until tonight
or tomorrow though.

Thanks, to everyone on the list for help while I'm in
Perl/CGI infancy. ;-)

Ron Smith

> #!/www/perl/bin/perl -wT
> use strict;
> use DBI;
> use CGI qw(:standard);
> use CGI::Carp qw(fatalsToBrowser);
> my $sku = param('sku');
> my $partNum = param('partNum');
> my $name = param('name');
> my $descr = param('descr');
> my $stockNum = param('stockNum');
> my $qty = param('qty');
> my $img = param('img');
> my $vendNum = param('vendNum');
> my $price = param('price');
> my $dbh = DBI->connect("DBI:mysql:company",
> "username", "password") or die "Error:
> $DBI::errstr\n";
> my $sql = "INSERT INTO products VALUES ('$sku',
> '$partNum', '$name', '$descr', '$stockNum', '$qty',
> '$img', 'vendNum', '$price')";
> my $sth = $dbh->prepare($sql);
> my $sth->execute; <=============line 21
> $dbh->disconnect;
> 
> 
> So, let's build a test script that includes all of
> the things I
> mentioned.
> -------------------------- cut here
> ------------------------
> #!/usr/bin/perl
> use strict;
> use warnings; 
> use Data::Dumper;
> use DBI;
> 
> our $DBH = DBI->connect( 'dbi:mysql:dbname=test',
> undef , undef ); 
> 
> die "no database: ", DBI->errstr unless $DBH; 
> 
> 
> # version for running in CGI
> #my ($sku, $partNum, $name, $descr, $stockNum,
> #    $qty, $img, $vendNum, $price) = map { param($_)
> } qw / sku partNum name descr stockNum qty img
> vendNum price /; 
> 
> 
> #
> # brute force for testing
> #
> my $sku = '123456';
> my $partNum = '501-1627';
> my $name = 'TGX Frame Buffer';
> my $descr = 'Sun TGX frame buffer; CG6';
> my $stockNum = 'A-102-55';
> my $qty = 10;
> my $img = undef;
> my $vendNum = '5011627';
> my $price = '12.75';
> 
> my $sql = qq { INSERT INTO
>                  product
>                  ( sku, partNum, name, descr, stockNum, qty,
> img, vendNum, price )
>                  VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
>              };
> 
> my $sth = $DBH->prepare($sql);
> 
> die "No statement handle: ", $DBH->errstr unless
> $sth;
> 
> my $rv = $sth->execute( $sku, $partNum, $name,
> $descr, $stockNum, $qty, $img, $vendNum, $price );
> 
> doe "Something was wrong: ", $sth->errstr unless
> defined $rv;
> 
> print "JOY";
> 
> $DBH->disconnect;
> -------------------------- cut here
> ------------------------
> 
> 
> This works.
> 
> By the way, in copying your program I found your
> bug.  Look lin line
> 20 and it should stand out.
> 
> 
> 
> 
> 


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to