После поиска множества ресурсов / ответов по этой теме я решил написать свой собственный код. Основываясь на ответе @ TaylorOtwell здесь, вот как я обрабатываю входящий запрос $ _GET и изменяю / манипулирую каждым элементом.
Предполагая, что URL-адрес: http://domain.com/category/page.php?a=b&x=y
И мне нужен только один параметр для сортировки: либо? Desc = column_name, либо? Asc = column_name. Таким образом, для одновременной сортировки и сортировки достаточно одного параметра url. Таким образом, URL-адрес будет http://domain.com/category/page.php?a=b&x=y&desc=column_name при первом щелчке по строке заголовка связанной таблицы.
Затем у меня есть заголовки строк таблицы, которые я хочу отсортировать по убыванию при первом щелчке мыши и ASC при втором щелчке того же заголовка. (При каждом первом щелчке сначала следует «ORDER BY column DESC»). И если сортировка отсутствует, по умолчанию выполняется сортировка по «дате, затем идентификатору».
Вы можете улучшить его дальше, например, вы можете добавить функции очистки / фильтрации к каждому компоненту $ _GET, но нижеследующая структура закладывает основу.
foreach ($_GET AS $KEY => $VALUE){
if ($KEY == 'desc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE DESC";
$URL_ORDER = $URL_ORDER . "&asc=$VALUE";
} elseif ($KEY == 'asc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE ASC";
$URL_ORDER = $URL_ORDER . "&desc=$VALUE";
} else {
$URL_ORDER .= "&$KEY=$VALUE";
$URL .= "&$KEY=$VALUE";
}
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}
(Вы можете использовать $ _SERVER [SCRIPT_URI] для полного URL, начинающегося с http://domain.com )
Затем я использую полученный $ ORDER, полученный выше, в запросе MySQL:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Теперь функция просмотра URL-адреса, если есть предыдущая сортировка, и добавление параметра сортировки (и упорядочивания) к URL-адресу с помощью "?" или «&» в порядке:
function sort_order ($_SORT){
global $SORT, $URL_ORDER, $URL;
if ($SORT == $_SORT){
return $URL_ORDER;
} else {
if (strpos($URL, '?') !== false){
return "$URL&desc=$_SORT";
} else {
return "$URL?desc=$_SORT";
}
}
}
Наконец, заголовок строки таблицы для использования функции:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Резюме: это прочитает URL-адрес, изменит каждый из компонентов $ _GET и сделает конечный URL-адрес с параметрами по вашему выбору с правильной формой использования "?" а также "&"
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
. Но вам нужноpecl install pecl_http
или установить jakeasmith / http_build_url через composer.