Bug 17375: Search by dateofbirth - handle invalid dates

Prevent internal software error when searching patron with invalid birth date

To reproduce:

- Go to Home > Patron
- Expand patron search (click on + at the left of the search button)
- In drop down 'Search fields', select 'Date of birth'
- Enter a valid date (e.g. 11.02.1995 if syspref 'dateformat' is set to dmydot)
Result: Search works OK
- Enter an invalid date, e.g. 11.02 or abcd...
Result: Internal server error

- Do a patron search with many results
- Use filter on results screen, select 'Date of birth' as search field and
  enter an invalid date to search (e.g. 'a')
Result: Endless message 'Processing'

To test:
- Apply patch
- Repeat steps above
- In both cases, you should get "No results"

Signed-off-by: Marc Véron <veron@veron.ch>
Signed-off-by: Lucio Moraes <lmoraes@catalyst.net.nz>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
This commit is contained in:
Jonathan Druart 2016-10-04 11:55:25 +01:00 committed by Kyle M Hall
parent 12167c57d0
commit 9b34b07d62
3 changed files with 21 additions and 18 deletions

View File

@ -20,7 +20,25 @@ sub search {
$searchmember = $dt_params->{sSearch} // '';
}
my ($iTotalRecords, $iTotalDisplayRecords);
my ($sth, $query, $iTotalRecords, $iTotalDisplayRecords);
my $dbh = C4::Context->dbh;
# Get the iTotalRecords DataTable variable
$query = "SELECT COUNT(borrowers.borrowernumber) FROM borrowers";
$sth = $dbh->prepare($query);
$sth->execute;
($iTotalRecords) = $sth->fetchrow_array;
if ( $searchfieldstype eq 'dateofbirth' ) {
# Return an empty list if the date of birth is not correctly formatted
$searchmember = eval { output_pref( { str => $searchmember, dateformat => 'iso', dateonly => 1 } ); };
if ( $@ or not $searchmember ) {
return {
iTotalRecords => 0,
iTotalDisplayRecords => 0,
patrons => [],
};
}
}
# If branches are independent and user is not superlibrarian
# The search has to be only on the user branch
@ -30,7 +48,6 @@ sub search {
}
my $dbh = C4::Context->dbh;
my $select = "SELECT
borrowers.borrowernumber, borrowers.surname, borrowers.firstname,
borrowers.streetnumber, borrowers.streettype, borrowers.address,
@ -126,7 +143,7 @@ sub search {
$limit = "LIMIT $dt_params->{iDisplayStart},$dt_params->{iDisplayLength}";
}
my $query = join(
$query = join(
" ",
($select ? $select : ""),
($from ? $from : ""),
@ -134,7 +151,7 @@ sub search {
($orderby ? $orderby : ""),
($limit ? $limit : "")
);
my $sth = $dbh->prepare($query);
$sth = $dbh->prepare($query);
$sth->execute(@where_args);
my $patrons = $sth->fetchall_arrayref({});
@ -144,12 +161,6 @@ sub search {
$sth->execute(@where_args);
($iTotalDisplayRecords) = $sth->fetchrow_array;
# Get the iTotalRecords DataTable variable
$query = "SELECT COUNT(borrowers.borrowernumber) FROM borrowers";
$sth = $dbh->prepare($query);
$sth->execute;
($iTotalRecords) = $sth->fetchrow_array;
# Get some information on patrons
foreach my $patron (@$patrons) {
($patron->{overdues}, $patron->{issues}, $patron->{fines}) =

View File

@ -64,10 +64,6 @@ if ( $quicksearch and $searchmember ) {
my $searchfieldstype = $input->param('searchfieldstype') || 'standard';
if ( $searchfieldstype eq "dateofbirth" ) {
$searchmember = output_pref({dt => dt_from_string($searchmember), dateformat => 'iso', dateonly => 1});
}
$template->param( 'alphabet' => C4::Context->preference('alphabet') || join ' ', 'A' .. 'Z' );
my $view = $input->request_method() eq "GET" ? "show_form" : "show_results";

View File

@ -47,10 +47,6 @@ my $searchfieldstype = $input->param('searchfieldstype') || 'standard';
my $has_permission = $input->param('has_permission');
my $selection_type = $input->param('selection_type');
if ( $searchfieldstype eq "dateofbirth" ) {
$searchmember = output_pref({dt => dt_from_string($searchmember), dateformat => 'iso', dateonly => 1});
}
# variable information for DataTables (id)
my $sEcho = $input->param('sEcho');