in reply to SQL prepared statements using MySQL In ()

G'day djlerman,

"What is the useful wisdom around this?"

TMTOWTDI. Here's how I might tackle this.

In the code example below, I've used all of these features. The two print statements show how the variables are interpolated into the prepare() and execute() methods (note that @valuesForIn expands to a space-separated list in the double-quoted string).

$ perl -e ' use strict; use warnings; # Somewhere earlier in your code, something like this: # my $dbh = DBI->connect( # $data_source, $username, $auth, # {RaiseError => 1, ...} # ); my @valuesForIn = 1..5; my $query = qq{ SELECT field1 FROM table1 WHERE field2 IN (@{[join ",", qw{?} x @valuesForIn]}) }; print "my \$sth1 = \$dbh->prepare($query);\n"; print "\$sth1->execute(@valuesForIn);\n"; ' my $sth1 = $dbh->prepare( SELECT field1 FROM table1 WHERE field2 IN (?,?,?,?,?) ); $sth1->execute(1 2 3 4 5);

— Ken

Replies are listed 'Best First'.
Re^2: SQL prepared statements using MySQL In ()
by djlerman (Beadle) on Aug 11, 2023 at 16:53 UTC
    Thank You. This is similar to how I solved it.
    # Set up variable for the Parameters for the entire query my @sqlParameters = (); # set up variable for just the IN() statement my @valuesForIn = (1,2,3,4,5); # a value for another field my $field3 = 'abc123'; my $query = " SELECT field1 FROM table1 WHERE field2 IN (@{[join',', ('?') x @valuesForIn]}) AND field3 = ? "; push(@sqlParameters, @valuesForIn); push(@sqlParameters, $field3); my $sth = $dbh->prepare($query) or die $dbh->errstr; $sth->execute(@sqlParameters) or die $dbh->errstr;
    Note: I kept separate @sqlParameters variable J.I.C. the query needs to be extended with more parameters.