У меня слишком много комментариев для комментария.
К вашему актуальному вопросу нам нужно знать несколько вещей, чтобы иметь возможность вам помочь.
- Что значит
db_hoh
return, ссылка на хеш или список пар ключ-значение. - Как вы понимаете, «Не работает»?Это не работает вообще?Завершает ли он какую-то операцию, но дает ли вы неожиданный результат?
Далее, у меня есть несколько стилистических комментариев к вашему коду.Мне кажется, что вы пришли из мира Си, не так ли?
- Распаковка
@_
, поскольку назначение списка выглядит чище - Объявление
%results
может подождать, пока онозаполнен - Если я не пойму неправильно, вам не нужно использовать
$json_passed
, вместо этого вы можете проверить, определено ли $json
- В подпункте
narrow
вы можете избежать создания$params
Вот обновленный код:
sub build_results_hash {
my ($search, $json) = @_;
my $dbh = db_connect(-db=>'ghgs');
my $db_search = html_db_input($search,$dbh);
my %results = db_hoh(
-query=>"SELECT listing_id,MATCH(search) AGAINST($db_search) as relevance FROM search WHERE MATCH(search) AGAINST($db_search) LIMIT 1000",
-key=>"listing_id",
-dbh=>$dbh
);
if((defined $json) and ($json ne '[]'))
{
narrow_results_hash(\%results,$search,$dbh,$json);
}
db_x($dbh);
return \%results;
}
sub narrow_results_hash
{
use JSON::XS; #unless you expect this import to be local it looks funny here
my %results = %{ shift() };
# ...
}
Наконец, и, возможно, самое главное, если html_db_input
не очищает вход, который хранится в $db_search
,вы оставляете себя открытым для SQL-инъекций атак.Выглядит так, как будто у вас есть собственная библиотека доступа к БД, но если бы вы использовали DBI , я бы сделал что-то вроде:
my $dbh = ...; # connect to db
my $sth = $dbh->prepare('SELECT listing_id,MATCH(search) AGAINST(?) as relevance FROM search WHERE MATCH(search) AGAINST(?) LIMIT 1000');
$sth->execute($db_search,$db_search);
my $results = $sth->fetchall_hashref('listing_id');
Это предотвращает изменение содержимого $db_search
Оператор SQL.