SPUG: BD::mysql::st execute failed:

Peter Darley pdarley at kinesis-cem.com
Wed Sep 27 08:40:14 PDT 2006


RE: SPUG: BD::mysql::st execute failed:Adrian,

    That's a good point.  I find that with our database the query planning
doesn't take much of the execute time, unless it's a huge query, which
probably would suffer more from poor planning than from having to plan
multiple times.  I also find that I don't do queries in loops, so my
experience may not be typical.

Thanks,
Peter
  -----Original Message-----
  From: spug-list-bounces+pdarley=kinesis-cem.com at pm.org
[mailto:spug-list-bounces+pdarley=kinesis-cem.com at pm.org]On Behalf Of Adrian
Hands
  Sent: Wednesday, September 27, 2006 8:31 AM
  To: spug-list at pm.org
  Subject: Re: SPUG: BD::mysql::st execute failed:


  Generally speaking,
  If you use placeholders, the driver will use db bind variables and the db
will be able to cache the statement and avoid reparsing on each execution.
  If you don't use placeholders, particularly in a loop, you'll pollute the
db's statement cache.

  On the other hand, the statement analyzer will determine the execution
plan BEFORE the vars are bound, so
  it won't have the benefit of knowing the value and will assume the worst.
  This becomes an issue with statements like:

    where foo_col LIKE ?

  (if the bind-var is 'foo%', for example, an index on foo_col will likely
be very useful, but if the bind-var is '%foo', for example, the index will
be useless)

  YMMV depending on the db, db version and driver.


  -----Original Message-----
  From: spug-list-bounces+aeh=akc.org at pm.org on behalf of Peter Darley
  Sent: Wed 9/27/2006 11:20 AM
  To: Jacinta Richardson; spug-list at pm.org
  Cc: luis medrano
  Subject: Re: SPUG: BD::mysql::st execute failed:

  Jacinta,

          I don't agree.  Anything that hides the actual SQL statement is
bad bad
  bad.  If there wasn't an alternative it would be worth putting up with the
  place holders, but since you can get the same protection without hiding
the
  exact query, I don't think it's a very good practice.  Things like
  SQL::Abstract make me cringe. :)

  Thanks,
  Peter

  -----Original Message-----
  From: spug-list-bounces+pdarley=kinesis-cem.com at pm.org
  [mailto:spug-list-bounces+pdarley=kinesis-cem.com at pm.org]On Behalf Of
  Jacinta Richardson
  Sent: Saturday, September 23, 2006 6:45 PM
  To: spug-list at pm.org
  Cc: luis medrano
  Subject: Re: SPUG: BD::mysql::st execute failed:


  Peter Darley wrote:

  > $Query = "INSERT INTO HTML_Pages (Page_ID, Type, Entity, Name, Title,
  > Content) VALUES (" . Quote($Args{PageID}) . ", " . Quote($Args{Type}) .
",
  "
  > . Quote($Args{Entity}) . ", " . Quote($Args{Name}) . ", " .
  > Quote($Args{Title}) . ", " . Quote($Args{Content}) . ")";
  >
  > $Neo::DB::Shopper->do($Query) || die "Bad Query!\n\t$Query";

  It's still a better solution to use placeholders:

  my @values = ($post_author, $post_date, $post_date_gmt, "@post_content",
          $post_title, $post_status, $comment_status, $ping_status,
$post_name,
          $post_modified, $post_modified_gmt, $guid);

  my $sth1 = $dbh->prepare("INSERT INTO wp_posts (post_author, post_date,
                  post_date_gmt, post_content, post_title, post_status,
                  comment_status, ping_status, post_name, post_modified,
                  post_modified_gmt, guid)
                  VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
          or die $dbh->errstr;

  my $rv1 = $sth->execute(@values);


  As it says in the documentation, using place holders allows the database
  engine
  to be more efficient as well as ensuring that your values are properly
  quoted
  for whichever database engine you are using (and if your underlying
database
  engine changes, then that's handled too!

  You may also find it useful to look into SQL::Abstract as it makes these
  large
  inserts and updates much easier.  Of course there's always
  Class::DBI/DBIx::Class if you want to take it a step further than that
too.

          my %fieldvars = (
                  post_author => $post_author,
                  post_date   => $post_date,
                  ...
                  guid        => $guid,
          );

          use SQL::Abstract;

          my $sql = SQL::Abstract->new;
          my($stmt, @bind) = $sql->insert("wp_posts", \%fieldvals);

          my $sth = $dbh->prepare($stmt);
          $sth->execute(@bind);

  All the best,

          Jacinta

  --
     ("`-''-/").___..--''"`-._          |  Jacinta Richardson         |
      `6_ 6  )   `-.  (     ).`-.__.`)  |  Perl Training Australia    |
      (_Y_.)'  ._   )  `._ `. ``-..-'   |      +61 3 9354 6001        |
    _..`--'_..-_/  /--'_.' ,'           | contact at perltraining.com.au |
   (il),-''  (li),'  ((!.-'             |   www.perltraining.com.au   |
  _____________________________________________________________
  Seattle Perl Users Group Mailing List
       POST TO: spug-list at pm.org
  SUBSCRIPTION: http://mail.pm.org/mailman/listinfo/spug-list
      MEETINGS: 3rd Tuesdays
      WEB PAGE: http://seattleperl.org/

  _____________________________________________________________
  Seattle Perl Users Group Mailing List
       POST TO: spug-list at pm.org
  SUBSCRIPTION: http://mail.pm.org/mailman/listinfo/spug-list
      MEETINGS: 3rd Tuesdays
      WEB PAGE: http://seattleperl.org/





-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.pm.org/pipermail/spug-list/attachments/20060927/23018fdb/attachment.html 


More information about the spug-list mailing list