Для того чтобы сделать заголовки столбцов активными ссылками, которые повторно вызывают сценарий для формирования вывода, упорядоченного по указанному столбцу, нужно создать такую строку заголовков:









Для построения таких заголовков сценарию необходимо знать имена столбцов таблицы, а также собственный URL. В рецептах 9.5 и 18.1 было показано, как получать эти сведения, используя метаданные запроса и информацию из окружения сценария.


Например, сценарий PHP может генерировать строку заголовков для столбцов указанного запроса так:

$self_path = get_self_path ();
print ("\n");
for ($i = 0; $i < mysql_num_fields ($result_id); $i++)
{
$col_name = mysql_field_name ($result_id, $i);
printf ("\n",
$self_path,
urlencode ($col_name),
htmlspecialchars ($col_name));
}
print ("\n");

Сценарий clicksort.php реализует именно такой способ вывода. Он извлекает из окружения параметр sort, указывающий, по какому столбцу следует выполнить сортировку. Затем сценарий использует параметр для формирования подобного запроса:

SELECT * FROM $tbl_name ORDER BY $sort_col LIMIT 50

(Если параметр sort не указан, сценарий использует инструкцию ORDER BY 1 для задания сортировки по умолчанию по первому столбцу.) Инструкция LIMIT используется исключительно для того, чтобы избежать больших объемов вывода для больших таблиц.

Сценарий выглядит так:

# clicksort.php – вывод результата запроса в виде таблицы HTML со столбцами,
# сортируемыми по щелчку на заголовке.
# Строки таблицы базы данных выводятся в виде таблицы HTML.


Заголовки столбцов# представлены гиперссылками, повторно вызывающими сценарий для вывода
# таблицы, упорядоченной по выбранному столбцу. Для больших таблиц
# вывод ограничен 50 строками.
include "Cookbook.php";
include "Cookbook_Webutils.php";
$title = "Table Display with Click-To-Sort Column Headings";
?>


<?php print ($title); ?>

# ----------------------------------------------------------------------
$tbl_name = "mail"; # таблица для вывода; можно изменить
$conn_id = cookbook_connect ();
print ("

Table: " . htmlspecialchars ($tbl_name) . "

\n");
print ("

Click on a column name to sort the table by that column.

\n");
# Получить имя столбца для сортировки (необязательно). Если отсутствует,
# использовать столбец 1. Иначе выполнить простую проверку корректности имени;
# оно должно включать только буквенно-цифровые символы и подчеркивание.
$sort_col = get_param_val ("sort"); # имя столбца сортировки (необязательно)
if (!isset ($sort_col))
$sort_col = "1"; # сортировка по первому столбцу
else if (!ereg ("^[0-9a-zA-Z_]+$", $sort_col))
die (htmlspecialchars ("Column name $sort_col is invalid"));
# Создание запроса для выбора из указанной таблицы записей, возможно,
# упорядоченных по определенному столбцу. Вывод ограничен 50 строками
# во избежание вывода всего содержимого большой таблицы.
$query = "SELECT * FROM $tbl_name";
$query .= " ORDER BY $sort_col";
$query .= " LIMIT 50";
$result_id = mysql_query ($query, $conn_id);
if (!$result_id)
die (htmlspecialchars (mysql_error ($conn_id)));
# Вывод результатов запроса в виде таблицы HTML. Используем метаданные запроса
# для получения имен столбцов и вывода их в первой строке таблицы в виде
# гиперссылок, вызывающих повторное отображение таблицы, упорядоченной
# по соответствующему столбцу.
print ("

Сортировка результатов запроса по произвольному столбцу

Задача
Вы хотите вывести результат запроса на веб-странице в виде таблицы, позволяющей пользователю выбрать столбец, по которому будут упорядочены записи таблицы.

Решение
Сделайте заголовок каждого столбца гиперссылкой, выводящей таблицу, упорядоченную по соответствующему столбцу.

Обсуждение
Работающий веб-сценарий определяет, какое действие следует предпринять, запрашивая значения параметров окружения. Обычно такие параметры поступают от пользователя, но ничто не мешает сценарию самостоятельно добавить параметры в URL. Например, именно так один вызов сценария может пересылать информацию следующему вызову. Получается, что сценарий взаимодействует сам с собой при помощи URL, генерируемых для выполнения определенных действий. Этот прием можно применять для вывода результата запроса в таком виде, чтобы пользователь мог выбрать, по какому столбцу результата упорядочивать вывод. Заголовки столбцов превращаются в активные ссылки, которые заново выводят таблицу, отсортированную по указанному столбцу.

Примеры раздела будут работать с таблицей mail:

mysql> SELECT * FROM mail;

+-----------------------+---------+--------+---------+---------+----------+
| t | srcuser | srchost | dstuser | dsthost | size |
+-----------------------+---------+--------+---------+---------+----------+
| 2001-05-11 10:15:08 | barb | saturn | tricia | mars | 58274 |
| 2001-05-12 12:48:13 | tricia | mars | gene | venus | 194925 |
| 2001-05-12 15:02:49 | phil | mars | phil | saturn | 1048 |
| 2001-05-13 13:59:18 | barb | saturn | tricia | venus | 271 |
| 2001-05-14 09:31:37 | gene | venus | barb | mars | 2291 |
| 2001-05-14 11:52:17 | phil | mars | tricia | saturn | 5781 |
| 2001-05-14 14:42:21 | barb | venus | barb | venus | 98151 |
| 2001-05-14 17:03:01 | tricia | saturn | phil | venus | 2394482 |
| 2001-05-15 07:17:48 | gene | mars | gene | saturn | 3824 |
| 2001-05-15 08:50:57 | phil | venus | phil | venus | 978 |
| 2001-05-15 10:25:52 | gene | mars | tricia | saturn | 998532 |
| 2001-05-15 17:35:31 | gene | saturn | gene | mars | 3856 |
| 2001-05-16 09:00:28 | gene | venus | barb | mars | 613 |
| 2001-05-16 23:04:19 | phil | venus | barb | venus | 10294 |
| 2001-05-17 12:49:23 | phil | mars | tricia | saturn | 873 |
| 2001-05-19 22:21:51 | gene | saturn | gene | venus | 23992 |
+-----------------------+---------+--------+---------+---------+---------+

Для извлечения содержимого таблицы и его вывода в виде таблицы HTML можно применять приемы, описанные в рецепте 17.3.


Мы будем применять те же способы, только немного изменим их, чтобы сформировать заголовки столбцов, по щелчку на которых таблица упорядочивается по соответствующему столбцу («click to sort»).

«Обычная» таблица HTML будет содержать строку заголовков столбцов, состоящую только из имен столбцов:

t srcuser srchost dstuserdsthost size
t srcuser srchost dstuser dsthost size
%s
\n");
$self_path = get_self_path ();
print ("\n");for ($i = 0; $i < mysql_num_fields ($result_id); $i++)
{
$col_name = mysql_field_name ($result_id, $i);
printf ("\n",
$self_path,
urlencode ($col_name),
htmlspecialchars ($col_name));
}
print ("\n");
while ($row = mysql_fetch_row ($result_id))
{
print ("\n");
for ($i = 0; $i < mysql_num_fields ($result_id); $i++)
{
# Кодировать значения, используя   для пустых ячеек.
$val = $row[$i];
if (isset ($val) && $val != "")
$val = htmlspecialchars ($val);
else
$val = " ";
printf ("\n", $val);
}
print ("\n");
}
mysql_free_result ($result_id);
print ("
%s
%s
\n");
mysql_close ($conn_id);
?>



Заполнители можно использовать только для значений данных, но не для идентификаторов, которыми и являются имена столбцов. Параметр sort – это имя столбца, поэтому его нельзя изменять при помощи заполнителей и функции кодирования. Вместо этого сценарий выполняет элементарную проверку на присутствие в имени только буквенно-цифровых символов и подчеркиваний. Этот простой тест работает для большей части имен таблиц (хотя и может дать сбой для таблицы с необычным именем). Такие же проверки выполняются для имен базы данных, индекса, столбца и псевдонима.

Можно проверить корректность имен столбцов другим способом – запустить запрос SHOW COLUMNS для определения того, какие столбцы действительно содержатся в таблице. Если столбец сортировки не входит в их число, то он не является разрешенным. Рассмотренный в разделе сценарий clicksort.php не делает этого. Однако дистрибутив recipes включает в себя аналогичный сценарий на Perl clicksort.pl, выполняющий подобные проверки. Обратитесь к нему, если вам нужна дополнительная информация.Ячейки строк, следующих за строкой заголовков, содержат значения данных из таблицы базы данных, выведенных как статический текст. Пустые ячейки выводятся при помощи  , поэтому они окружены такой же рамкой, как непустые значения.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Ведение журнала Apache с помощью MySQL
Выполнение поиска и получение результатов
Журнал доступа к веб-странице
Загрузка в форму записи базы данных
Использование ввода через Web для формирования запросов

Вернуться в раздел: MySQL / 18. Обработка ввода через Web с помощью MySQL