Сортировка данных в PHP-скриптах
Выбери формат для чтения

Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇

Лекция №11
2.8. Сортировка данных
Результирующий набор записей, полученный в результате выполнения запроса на выборку, по умолчанию отображается в соответствии с расположением этих записей в таблице. Часто при отображении данных для пользователя или при печати отчетов требуется упорядочивать результирующие записи, то есть проводить сортировку. Например, каталог фильмов будет более наглядным, если названия будут находиться в алфавитном порядке.
Для сортировки данных в PHP-скриптах используется запрос на выборку, содержащий предложение ORDER BY.
Пример 7.8. Сортировка записей: покажем механизм сортировки данных. Для этого отредактируем файл catalog.php, созданный в предыдущих разделах, реализовав в нем возможность сортировки записей по одному из столбцов .
"; } echo "
";
?>
Результат выполнения скрипта показан на рисунке 7.7.
Рис. 7.7. Сортировка записей каталога
Рассмотрим механизм работы этого скрипта:
• заголовки таблицы представляются в виде ссылок, содержащих соответствующие параметр, по котором проводится сортировка ();
• при нажатии на одну из ссылок в заголовках (isset($_GET['sort'])) параметр сортировки записывается в переменную $sort ($sort = $_GET['sort']);
• в зависимости от значений переменной $sort (switch($sort)) формируется соответствующее предложение ORDER BY ($order_by = 'ORDER BY');
• при формировании запроса на выборку данных к нему добавляется полученное предложение ORDER BY ($query = "SELECT * FROM FILMS ". $order_by).
2.9. Постраничный вывод данных
Базы данных современных веб-приложений, как правило, хранят огромное количество записей. Поэтому отображение всех данных на одной странице является нецелесообразным с точки зрения быстродействия системы и удобства для пользователей. Гораздо более рационально использовать постраничный вывод данных, когда на одной странице выводится лишь часть записей, а доступ к остальным записям осуществляется через навигационное меню.
Постраничный вывод данных в PHP-скриптах реализуется с помощью запроса на выборку, содержащего конструкцию FIRST…SKIP. Для использования этой конструкции данные должны быть упорядочены, то есть запрос на выборку должен содержать также предложение ORDER BY.
Пример 7.9. Постраничный вывод записей: реализуем постраничный вывод записей в созданном ранее файле каталога catalog.php. Вывод навигационного меню осуществим с помощью пользовательской функции.
$total) $n = $total; if ($n != 1) $pervpage = '<<<'; if ($n != $total) $nextpage = '>>>'; if($n - 2 > 0) $page2left = ' '. ($n - 2) .' | '; if($n - 1 > 0) $page1left = ''. ($n - 1) .' | '; if($n + 2 <= $total) $page2right = ' | '. ($n + 2) .''; if($n + 1 <= $total) $page1right = ' | '. ($n + 1) .''; echo '
";
?>
Результат выполнения скрипта показан на рисунке 7.8.
Рис. 7.8. Постраничный вывод записей
Рассмотрим механизм работы этого скрипта:
• объявляется функция формирования навигационного меню getNavigationMenu, принимающая следующие аргументы:
◦ $num – количество записей на одной странице;
◦ $total_items – общее количество записей;
◦ $n – номер текущей страницы;
◦ $param – дополнительные параметры, передающиеся в GET-запросе;
• в переменную $total записывается общее количество страниц ($total = intval(($total_items[0] - 1) / $num) + 1);
• если номер страницы превышает общее число страниц (if($n > $total)), выводится последняя страница ($n = $total);
• в зависимости от значений переменной $n генерируется соответствующий HTML-код навигационного меню;
• непосредственно в самом теле скрипта задается количество записей на одной странице ($num = 2), номер текущей страницы ($n = strip_tags(trim($_GET['n']))), номер первой отображаемой записи ($start = $n * $num - $num) и определяется общее количество записей ($total_items = ibase_fetch_row(ibase_query("SELECT COUNT(*) FROM FILMS")));
• вызывается созданная функция getNavigationMenu с определенными ранее аргументами (getNavigationMenu ($num,$total_items,$n, 'sort='.$sort));
• выполняется запрос на выборку $num записей, начиная с записи $start ("SELECT FIRST $num SKIP $start * FROM FILMS " . $order_by).
2.10. Поиск в базе данных
Любой каталог, помимо хранения и редактирования записей, подразумевает возможность поиска необходимой пользователю информации. Поиск в PHP-скриптах, как правило, реализуется с помощью запросов на выборку, содержащих выражения CONTAINING или LIKE.
Пример 7.10. Поиск записей: реализуем возможность поиска записей в созданном ранее файле каталога catalog.php.
$total) $n = $total; if ($n != 1) $pervpage = '<<<'; if ($n != $total) $nextpage = '>>>'; if($n - 2 > 0) $page2left = ' '. ($n - 2) .' | '; if($n - 1 > 0) $page1left = ''. ($n - 1) .' | '; if($n + 2 <= $total) $page2right = ' | '. ($n + 2) .''; if($n + 1 <= $total) $page1right = ' | '. ($n + 1) .''; echo '
";
?>
Результат выполнения скрипта показан на рисунке 7.9.
Рис. 7.9. Поиск записей
Рассмотрим механизм работы этого скрипта:
• формируется форма поиска. Данные полученные с формы пересылаются в GET-запросе и обрабатываются в том же файле catalog.php (
"; } echo "
ID | Название | Жанр | Год | |
---|---|---|---|---|
$row[0] | $row[1] | $row[2] | $row[3] |
$total) $n = $total; if ($n != 1) $pervpage = '<<<'; if ($n != $total) $nextpage = '>>>'; if($n - 2 > 0) $page2left = ' '. ($n - 2) .' | '; if($n - 1 > 0) $page1left = ''. ($n - 1) .' | '; if($n + 2 <= $total) $page2right = ' | '. ($n + 2) .''; if($n + 1 <= $total) $page1right = ' | '. ($n + 1) .''; echo '
'.$pervpage.$page2left.$page1left.''.$n.''.$page1right.$page2right.$nextpage.'
';
}
//Инициализация переменных
$order_by = "";
$where = "";
$sort = "";
$host = "localhost:".dirname(__FILE__)."\base.fdb";
$user = "SYSDBA";
$pass = "masterkey";
$dbh = ibase_connect($host, $user, $pass);
if (isset($_GET['sort']))
{
$sort = $_GET['sort'];
switch($sort)
{
case '1': $order_by = 'ORDER BY NAME'; break;
case '2': $order_by = 'ORDER BY GENRE'; break;
case '3': $order_by = 'ORDER BY RELEASE_YEAR'; break;
}
}
if (isset($_POST['delete']))
{
$cbs = $_POST['cbs'];
$count = count($_POST['cbs']);
for ($i = 0; $i < $count; $i++)
{
$del = $cbs[$i];
$query = "DELETE FROM FILMS WHERE ID='$del'";
ibase_query($dbh, $query) or die ("Сбой при доступе к БД: " . ibase_errmsg());
}
}
$num = 2;
if (!empty($_GET['n']))
$n = strip_tags(trim($_GET['n']));
if(empty($n) or $n < 0) $n = 1;
$start = $n * $num - $num;
$total_items = ibase_fetch_row(ibase_query("SELECT COUNT(*) FROM FILMS"));
getNavigationMenu($num,$total_items,$n,'sort='.$sort);
$query = "SELECT FIRST $num SKIP $start * FROM FILMS " . $order_by;
$result = ibase_query($dbh, $query) or die ("Сбой при доступе к БД: " . ibase_errmsg());
while ($row = ibase_fetch_row($result))
{
echo "";
}
echo "ID | Название | Жанр | Год | |
---|---|---|---|---|
$row[0] | $row[1] | $row[2] | $row[3] |
$total) $n = $total; if ($n != 1) $pervpage = '<<<'; if ($n != $total) $nextpage = '>>>'; if($n - 2 > 0) $page2left = ' '. ($n - 2) .' | '; if($n - 1 > 0) $page1left = ''. ($n - 1) .' | '; if($n + 2 <= $total) $page2right = ' | '. ($n + 2) .''; if($n + 1 <= $total) $page1right = ' | '. ($n + 1) .''; echo '
'.$pervpage.$page2left.$page1left.''.$n.''.$page1right.$page2right.$nextpage.'
';
}
//Инициализация переменных
$order_by = "";
$where = "";
$sort = "";
$keyword = "";
$genre = "";
$host = "localhost:".dirname(__FILE__)."\base.fdb";
$user = "SYSDBA";
$pass = "masterkey";
$dbh = ibase_connect($host, $user, $pass);
if (isset($_GET['sort']))
{
$sort = $_GET['sort'];
switch($sort)
{
case '1': $order_by = 'ORDER BY NAME'; break;
case '2': $order_by = 'ORDER BY GENRE'; break;
case '3': $order_by = 'ORDER BY RELEASE_YEAR'; break;
}
}
if (isset($_POST['delete']))
{
$cbs = $_POST['cbs'];
$count = count($_POST['cbs']);
for ($i = 0; $i < $count; $i++)
{
$del = $cbs[$i];
$query = "DELETE FROM FILMS WHERE ID='$del'";
ibase_query($dbh, $query) or die ("Сбой при доступе к БД: " . ibase_errmsg());
}
}
if (!empty($_GET['keyword']) or !empty($_GET['genre']))
{
$where = "WHERE ";
if (!empty($_GET['keyword']))
{
$keyword = strip_tags(trim($_GET['keyword']));
if (!preg_match("/.{2,}/", $keyword))
{
echo 'Строка для поиска должна состоять из 2 или более символов
'; exit; } $conditions[] = "UPPER (NAME) LIKE UPPER ('%".$keyword."%')"; } if (!empty($_GET['genre'])) { $genre = strip_tags(trim($_GET['genre'])); $conditions[] = "UPPER (GENRE) LIKE UPPER ('%".$genre."%')"; } } else $conditions[]=''; $num = 2; if (!empty($_GET['n'])) $n = strip_tags(trim($_GET['n'])); if(empty($n) or $n < 0) $n = 1; $start = $n * $num - $num; $total_items = ibase_fetch_row(ibase_query("SELECT COUNT(*) FROM FILMS ". $where . implode(' AND ', $conditions))); if ($total_items[0] == 0) { echo 'Ничего не найдено
'; exit; } getNavigationMenu($num,$total_items,$n,'sort='.$sort.'&keyword='.$keyword.'&genre='.$genre); $query = "SELECT FIRST $num SKIP $start * FROM FILMS ". $where . implode(' AND ', $conditions). " ". $order_by; $result = ibase_query($dbh, $query) or die ("Сбой при доступе к БД: " . ibase_errmsg()); echo ""; while ($row = ibase_fetch_row($result)) { echo ""; } echo "ID | Название | Жанр | Год | |
---|---|---|---|---|
$row[0] | $row[1] | $row[2] | $row[3] |