Thread: Perl DBI question

Perl DBI question

From
"Kovalcik, Mike A [ITS]"
Date:
Hi,

I'm trying to setup some scripts that will allow me to use Perl DBI to
INSERT into my table.  However, I have not had any success at all.  I'm
using perl CGI as well so I've granted ALL permissions on my table to
the apache user and I still can't INSERT.  I can, however, UPDATE and
SELECT on the table, just not INSERT.

Here is a piece of my code:

#--Establish the DB connection
#--Assign the DB name
$dbName = 'checkbook';

#--Connect to the Pg DB using DBI
my $dbh = DBI->connect("dbi:Pg:dbname=$dbName");

$sth = $dbh->do("INSERT INTO transactions
(date,description,amount,confirmation,nameid,typeid) VALUES
('$datePaid','$description','$amount','$confirmation',$nameid,$typeid)")
;

Please HELP...........

Thanks,
Mike

Re: Perl DBI question

From
Bruno Wolff III
Date:
On Tue, Jun 17, 2003 at 16:51:33 -0500,
  "Kovalcik, Mike A [ITS]" <mkoval01@sprintspectrum.com> wrote:
>
> $sth = $dbh->do("INSERT INTO transactions
> (date,description,amount,confirmation,nameid,typeid) VALUES
> ('$datePaid','$description','$amount','$confirmation',$nameid,$typeid)")
> ;

Most likely you want single quotes around $nameid and $typeid.

Re: Perl DBI question

From
Jeremy Buchmann
Date:
> I'm trying to setup some scripts that will allow me to use Perl DBI to
> INSERT into my table.  However, I have not had any success at all.  I'm
> using perl CGI as well so I've granted ALL permissions on my table to
> the apache user and I still can't INSERT.  I can, however, UPDATE and
> SELECT on the table, just not INSERT.
>
> Here is a piece of my code:
>
> #--Establish the DB connection
> #--Assign the DB name
> $dbName = 'checkbook';
>
> #--Connect to the Pg DB using DBI
> my $dbh = DBI->connect("dbi:Pg:dbname=$dbName");
>
> $sth = $dbh->do("INSERT INTO transactions
> (date,description,amount,confirmation,nameid,typeid) VALUES
> ('$datePaid','$description','$amount','$confirmation',$nameid,$typeid)"
> )
> ;

What kind of error message are you getting?

With just a quick glance, I would say check your quoting.  i.e., is
$amount supposed to be quoted?

You can do parameter binding on $dbh->do statements also, like this:

$dbh->do("INSERT INTO transactions
(date,description,amount,confirmation,nameid,typeid) VALUES
(?,?,?,?,?,?)", undef, ($datePaid, $description, $amount,
$confirmation, $nameid, $typeid));

That takes care of all your quoting so you don't have to worry about it.

Also, you probably want to post this to the INTERFACES list.

--Jeremy


Re: Perl DBI question

From
greg@turnstep.com
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1



You should not be using the "do" method, but the prepare/execute model
instead. Using placeholders can not only be more efficient but allows
quoting to happen properly. Here is a rewrite:

#--Establish the DB connection
#--Assign the DB name
my $dbName = 'checkbook';
my $dbuser = "joe";
my $dbpass = "sixpak";

my $dbh = DBI->connect("dbi:Pg:dbname=$dbName", $dbuser, $dbpass, {AutoCommit=>1, RaiseError=>1})
  or die "Could not connect to the database: $DBI::errstr\n";

my $SQL = "
INSERT INTO transactions (date,description,amount,confirmation,nameid,typeid)
VALUES                   (?   ,?          ,?     ,?           ,?     ,?     )";

my $sth = $dbh->prepare($SQL);

my $count = $sth->execute($datePaid,$description,$amount, $confirmation,$nameid,$typeid);

print "Insert count: $count\n";


It is hard to tell why your inserts are going wrong without more information, but
the RaiseError should at least help catch some obvious errors.


- --
Greg Sabino Mullane greg@turnstep.com
PGP Key: 0x14964AC8 200306181337

-----BEGIN PGP SIGNATURE-----
Comment: http://www.turnstep.com/pgp.html

iD8DBQE+8KUHvJuQZxSWSsgRAhWoAJ9/aw9AaCMa5vGvEpvujEEBm4iBXQCggSSw
jPaGcdMt9Qq9XeJqttvdX48=
=x1nu
-----END PGP SIGNATURE-----



Re: Perl DBI question

From
Date:

setting RaiseError to true  is the way to go in DBI.
it catches most of the error and prints in apache error log.

if RaiseError = 1 one does not have to do the explicit
die after the connect even i think

regds
mallah,

>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
>
>
> You should not be using the "do" method, but the prepare/execute model  instead. Using
> placeholders can not only be more efficient but allows  quoting to happen properly. Here is a
> rewrite:
>
> #--Establish the DB connection
> #--Assign the DB name
> my $dbName = 'checkbook';
> my $dbuser = "joe";
> my $dbpass = "sixpak";
>
> my $dbh = DBI->connect("dbi:Pg:dbname=$dbName", $dbuser, $dbpass, {AutoCommit=>1,
> RaiseError=>1})
>  or die "Could not connect to the database: $DBI::errstr\n";
>
> my $SQL = "
> INSERT INTO transactions (date,description,amount,confirmation,nameid,typeid)  VALUES
>         (?   ,?          ,?     ,?           ,?     ,?     )";
>
> my $sth = $dbh->prepare($SQL);
>
> my $count = $sth->execute($datePaid,$description,$amount, $confirmation,$nameid,$typeid);
>
> print "Insert count: $count\n";
>
>
> It is hard to tell why your inserts are going wrong without more information, but  the
> RaiseError should at least help catch some obvious errors.
>
>
> - --
> Greg Sabino Mullane greg@turnstep.com
> PGP Key: 0x14964AC8 200306181337
>
> -----BEGIN PGP SIGNATURE-----
> Comment: http://www.turnstep.com/pgp.html
>
> iD8DBQE+8KUHvJuQZxSWSsgRAhWoAJ9/aw9AaCMa5vGvEpvujEEBm4iBXQCggSSw
> jPaGcdMt9Qq9XeJqttvdX48=
> =x1nu
> -----END PGP SIGNATURE-----
>
>
>
> ---------------------------(end of broadcast)--------------------------- TIP 7: don't forget to
> increase your free space map settings



-----------------------------------------
Get your free web based email at trade-india.com.
   "India's Leading B2B eMarketplace.!"
http://www.trade-india.com/