Uri Guttman <[email protected]> writes:
> On 05/12/2016 08:04 PM, lee wrote:
>> ... I appreciate perl for:
>>
>>
>> $dbh->do("INSERT INTO $T_ENTRIES (" .
>> join(', ', map($dbh->quote_identifier($_), $cgi->param)) . ') VALUES
>> (' .
>> join(', ', map($dbh->quote($_), map($cgi->param($_), $cgi->param))) .
>> ')')
>> if(scalar($cgi->param) == 111);
>>
> not bad but i have a few improvements that you may like.
>
> i would not call $cgi->param so often. easy enough to use arrays.
>
> my @cgi_params = $cgi->param() ;
> my @cgi_values = $cgi->param( @cgi_params ) ;
Oh, I didn't know you can do
'my @cgi_values = $cgi->param(@cgi_params);', thanks!
How does that play out?
my @cgi_values = $cgi->param($cgi->param);
And hence:
$dbh->do("INSERT INTO $T_ENTRIES (" .
join(', ', map($dbh->quote_identifier($_), $cgi->param)) . ') VALUES
(' .
join(', ', map($dbh->quote($_), $cgi->param($cgi->param))) . ')')
if(scalar($cgi->param) == 111);
?
You could make that:
if (scalar($cgi->param) == 111) {
my $i = join(', ', map($dbh->quote_identifier($_), $cgi->param));
my $v = join(', ', map($dbh->quote($_), $cgi->param($cgi->param)));
$dbh->do("INSERT INTO $T_ENTRIES ($i) VALUES ($v)");
}
Would that work?
> i like to build up the sql parts outside of the call and to use ?
> placeholders which are quoted for you.
>
> my $holders = join ',', ('?') x @cgi_params ;
>
> and i like here docs for sql so i can see the sql and not need all
> those quotes and noise. also assigning the sql to a scalar so i can
> print it out for debugging
>
> my $sql = <<SQL ;
> INSERT INTO $T_ENTRIES ( $holders ) VALUES ( $holders )
> SQL
>
> my $sth = $dbh->prepare( $sql ) ;
> $sth->execute( @cgi_params, @cgi_values ) ;
Don't you need (properly quoted) identifiers rather than place holders
where the identifiers go?
if (scalar($cgi->param) == 111) {
my @cgi_params = $cgi->param();
my @cgi_values = $cgi->param( @cgi_params );
@cgi_params = map($dbh->quote_identifier($_), @cgi_params);
unless (scalar(@cgi_params) != scalar(@cgi_values)) {
my $identifiers = join(', ', @cgi_params);
my $holders = join(', ', ('?') x scalar(@cgi_values));
my $sql = <<SQL;
INSERT INTO $T_ENTRIES ( $identifiers ) VALUES ( $holders )
SQL
my $sth = $dbh->prepare( $sql );
$sth->execute(@cgi_values);
$sth->finish();
} else {
print $cgi->p('ERROR: perhaps do something') . "/n";
}
}
Which version is better for performance?
> it may look longer but it is easier to read, debug and reuse this
> way. it can be made into a sub with other options (selecting or where
> clauses, etc.).
>
> i didn't add in the if condition but that can be put in front of this code.
I guess I just happened to finally learn the 'map()' function and
immediately found it extremely useful and elegant :)
Are there other programming languages having the same, or an equivalent?
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/