in reply to Re: Insert Row
in thread Insert Row

And now a comment about simplifying things. I don't advocate Class::DBI or any of the other SQL abstraction modules - but you can cleanup your SQL generation.

Try this:
$table =~ tr/A-Za-z0-9_//cd; my @fields = keys %columns; my @values = values %columns; # or @columns{@fields} my $sql = "INSERT INTO $table (" .join(", ", @fields) .") VALUES (" .join(", ", ("?") x @fields) .")"; my $sth = $dbh->prepare($sql) || die $DBI::Errstr; $sth->execute(@values) || die $DBI::Errstr;


my @a=qw(random brilliant braindead); print $a[rand(@a)];

Replies are listed 'Best First'.
Re^3: Insert Row
by reneeb (Chaplain) on Dec 08, 2006 at 08:07 UTC
    You should use quote_identifier instead of tr///.

    $table = $dbh->quote_identifier($table);
      I most certainly agree. I never program in such a way that I am passing in arbitrary table names though and so I've never needed to look up the method that would quote it for me. Thankyou for pointing out the correct method.

      In all cases the name of the table could be validated before trying to use it in actual SQL - either by using "show tables" in MySQL or by "SELECT table_name FROM user_tables" in Oracle. Either way I would not be using the user supplied data in that portion of the SQL.

      my @a=qw(random brilliant braindead); print $a[rand(@a)];