ОК, я совершенно не уверен, что вы имеете в виду, НО, мое лучшее понимание того, что вы пытаетесь сделать, это запросить, как вы делаете сейчас, НО, если конкретное поле не заполнено в форме, чтобы избежать добавления поле к предложению where
; в отличие от текущего запроса, который вместо этого and myField="*"
.
Правильно?
Если это так, вам нужно построить свой запрос и список замены, по частям:
my $sql = qq{SELECT MY_FIELD_LIST_TOO_LAZY_TO_TYPE FROM `gigs` WHERE 2=2};
my @replacement_values = (); # These go into execute() instead of "?"s
if ($city ne "*") {
$sql .= qq[AND city = ?];
push @replacement_values, $city;
}
if ($number1 ne "*") {
$sql .= qq[AND number > ?];
push @replacement_values, $number1;
}
# ... more values processed the same way
my $grabgig = $hookup->prepare($sql);
$grabgig->execute(@replacement_values) or die "Did not execute";
Если вы хотите сделать это более разумно (т.е. обобщить), у вас будут поля формы в хэше; иметь хеш-конфигурацию, сопоставляющую имя поля формы с именем столбца БД и оператором, и вместо этого сделать следующее как:
my %fields = (
city => ["city" , "="]
,number1 => ["number", ">"]
,number2 => ["number", "<"]
);
my $sql = qq{SELECT MY_FIELD_LIST_TOO_LAZY_TO_TYPE FROM `gigs` WHERE 2=2};
my @replacement_values = (); # These go into execute() instead of "?"s
foreach my $field (keys %form_data) {
next unless exists $fields{$field};
if ($form_data{$field} ne "*") {
$sql .= qq[ AND $fields{$field}->[0] $fields{$field}->[1] ?];
push @replacement_values, $form_data{$field};
}
}
my $grabgig = $hookup->prepare($sql);
$grabgig->execute(@replacement_values) or die "Did not execute";