Perl Mysql - Как искать конкретные данные на основе одного "основного" соответствия? - PullRequest
1 голос
/ 07 января 2011
User Form Input - City
User Form Input - Venue
User Form Input - Cover
User Form Input - Time
User Form Input - Date
User Form Input - Number1
User Form Input - Number2

(если они не заполнены, то при входе они закрываются на «*». Но может быть и то, что работает.)

my $grabgig = $hookup->prepare(qq{SELECT `VenueNumber`,`Venue`,`CoverCharge`,`SetLength`,`City`,`Owner`,`Date`,`Time`,`Image1`,`Number`

     FROM `gigs` 
     WHERE VenueNumber > ? AND `City` = ? AND `Venue` = ? AND `CoverCharge` = ? 
       AND Date = ? AND `Number` > ? AND `Number` < ?  
       AND `Time` LIKE ? LIMIT ?,?});

##########################################

$grabgig->execute('100',$city,$venue,$cover,'*',$number1,$number2,?,'0','6') 
    or die "Did not execute";

Это базовый пример выше.

Я хочу иметь возможность возвращать результаты, основанные на вводе данных по городу.

Если имеется больше входных данных, соответственно сузить результаты.

Но запрос ничего не возвращает, если поля пусты*.)новичок?

Ответы [ 3 ]

1 голос
/ 07 января 2011

ОК, я совершенно не уверен, что вы имеете в виду, НО, мое лучшее понимание того, что вы пытаетесь сделать, это запросить, как вы делаете сейчас, НО, если конкретное поле не заполнено в форме, чтобы избежать добавления поле к предложению 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";
0 голосов
/ 07 января 2011

Извините, панель форматирования не появилась, поэтому я перезагрузился. Теперь я не могу редактировать свой вопрос или комментарий.

Я пытаюсь обеспечить поиск пользователей.

Они выбирают город из выпадающего списка, после чего можно вводить / выбирать некоторые дополнительные данные, чтобы сузить результаты.

Необязательные данные May или May В таблице могут отсутствовать, это может быть пустое поле.

Я бы хотел, чтобы результаты отображались на основе выбранных критериев поиска в этом городе.

Итак, ГДЕ выбрано «входной город» = «столбец города таблицы», ищите другие варианты (игнорируйте этот конкретный критерий, если поле пустое) и возвращайте любые совпадения, существующие для этого города.

Затем я нажимаю в массив в то время как для вывода вывода.

Полагаю, это будет похоже на автомобильный запрос. Выберите make, где doors = 2, color = red и engine = hamsterwheel, но поле цвета может быть пустым в базе данных.

0 голосов
/ 07 января 2011

Я предполагаю, что вы хотите создать запрос, в котором только несколько входных параметров имеют допустимые значения, а остальные не определены. Если это действительно то, что вы хотите, вот что вы могли бы сделать: Построить запрос динамически. Вот шаги, которые вы могли бы предпринять, предполагая, что вы используете CGI.pm, и предполагая, что предложение where является просто серией «this = that» - в вашем случае у вас есть разные операторы - но идея та же.

Сначала создайте строку «где» из параметра запроса CGI (извините, непроверенный код):

my $qrystr = '';
foreach ($query->param) {
    if (my $val = $query->param($_)) {
        $qrystr .= "where $_ = " . $dbh->quote($val) . ' and  ';
    }
}
$qrystr .= "where 1 = 1";

Теперь вы можете просто подготовить и выполнить запрос: "select * from table $ qrystr"

Если вы хотите использовать автоматическое цитирование, вам придется использовать параметры связывания, которые являются простым расширением кода выше

Обновление В последнем истинном предложении "1 = 1" было пропущено "где" - извините, добавил его сейчас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...