Расширенный поиск код - PullRequest
       2

Расширенный поиск код

0 голосов
/ 23 января 2012

Я конвертирую Perl-скрипт для секретных объявлений / плоских файлов, чтобы использовать mysql / dbi;У меня есть этот код поиска, и он не очень хорошо работает.Он найдет Vintage_Trailers из item_category, но если я включу item_state, он ничего не найдет.Мне нужно, чтобы найти только Vintage_Trailers только в Неваде, например.Но пользователь не может выбрать состояние, поэтому нужно найти только Vintage_trailers.Или, может быть, только ключевые слова «Шаста» ... Что-то «из коробки», которое я могу изменить, было бы отлично.Любая помощь приветствуется.

$searchfor="$multi_input $keywords $user $item_category $item_city $item_state";
my $dsn = "DBI:mysql:$database";
my $dbh = DBI->connect($dsn, $userid, $password ) 
          or die $DBI::errstr;
my @searchthings = split(/ /,$searchfor);
foreach $thing(@searchthings)
     {
    if ($thing){
        $statement .= "(item_name like '%$thing%' or 
        item_desc like '%$thing%' or 
        item_desc2 like '%$thing%' or 
        item_category like '%$thing%' or 
        item_city like '%$thing%' or 
        item_state like '%$thing%' or 
        user like '%$thing%' ) ";
    }
}

$sth = $dbh->prepare(qq(select * from ads where $statement)) or  die $DBI::errstr;
$sth->execute();
    while ((my (@rows)) = $sth->fetchrow_array)
    {
    $total_row_count= $sth->rows;
    $database_rows = join ("\|", @rows);
    push (@database_rows,$database_rows);
    }
$sth->finish() or  die $DBI::errstr;
 $dbh->disconnect() or  die $DBI::errstr;

1 Ответ

0 голосов
/ 14 апреля 2012
$ANDOR = param('andor');#creates an AND OR search
if($ANDOR eq ""){ $ANDOR="AND";}

if($item_category){
$item_category = "$item_category";
} else{  $item_category=" "; 
}
$statement .= "item_category LIKE  ? ";
push(@binds,$item_category);


if($item_state){
$statement .= " $ANDOR item_state LIKE ? ";
push(@binds,$item_state);
}
if($item_city){
$statement .= " $ANDOR item_city LIKE ? ";
push(@binds,$item_city);
}
if($db_id){
$statement .= " $ANDOR db_id = ? ";
push(@binds,$db_id);
}

$keywords=param('keywords');
if(param('as_a_phrase')){
$keywords =~ s/ /\+/g;
}
if($keywords)
{
if(param('searchmatch') eq "exact")
{
$statement .= " $ANDOR (item_name = ? OR item_desc = ? OR item_desc2 = ? )";#
push(@binds,$keywords,$keywords,$keywords);

}
else
{   $statement .= " $ANDOR  ";

my @keywords = split(/ /,$keywords);
my $keywordcount=@keywords;

foreach my $keyword(@keywords)
{ $keywordcount2++;
$statement .= " (item_name LIKE ? 
OR item_desc LIKE ? 
OR item_desc2 LIKE ? )";
if ($keywordcount2 == $keywordcount) {$statement .= "";} else{ $statement .= " OR "; }
push(@binds, "%$keyword%","%$keyword%","%$keyword%");
}
}
}

$date_begin=param('date_begin');
if($date_begin){
$statement .= " $ANDOR modification_time > ? "; 
push(@binds,$date_begin);
}

if($user){
$statement .= " $ANDOR user LIKE ? ";
push(@binds,$user);
}


$price_low=param('price_low');
$price_high=param('price_high');
if (($price_low) && ($price_high)){
$statement .= " $ANDOR item_price BETWEEN ? AND ? ";
push(@binds,$price_low,$price_high);
}
elsif (($price_low) && ($price_high eq "")){
$statement .= " $ANDOR item_price > ? ";
push(@binds,$price_low);
}
elsif (($price_high) && ($price_low eq "")){
$statement .= " $ANDOR item_price BETWEEN ? AND ? ";
push(@binds,1,$price_high);
}
else
{  }


my $sth = $dbh->prepare(qq(SELECT * FROM ads WHERE $statement )) or  die $DBI::errstr;
$sth->execute(@binds);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...