В настоящее время я использую заголовки столбцов в качестве ссылок, которые при щелчке сортируют результаты по имени столбца, добавляя переменную get в URL. Вот пример:
<a href="
<?php
// Sorts by order id. If already sorted by order id, then it will change the link to sort descending
if(!isset($_GET['sortby']) || $_GET['sortby'] != 'order_id'){
echo $_SERVER['SCRIPT_NAME'] . '?sortby=order_id'; //example: tracker.php?sortby=order_id
} elseif(isset($_GET['sortby']) || $_GET['sortby'] == 'order_id'){
echo $_SERVER['SCRIPT_NAME'] . '?sortby=order_id_desc'; //example: tracker.php?sortby=order_id_desc
}?>
">Order ID</a>
У меня также есть форма, в которую пользователи могут войти, выбрать категорию из поля выбора, а затем ввести поисковую строку. Я использую операторы if и switch, чтобы проверить, установлены ли переменная $ _GET ['sortby'] и переменная $ _POST ['search_submit'], и, если это так, для запуска определенного оператора sql на основе значения переменной GET .
Существует 4 разных сценария.
1. По умолчанию: если ни сортировка, ни поиск не установлены . Этот работает отлично:
if(!isset($_GET['sortby']) && !isset($_POST['search_submit'])){ //Default, If no sort or search is set
$sql = 'SELECT *
FROM orders
ORDER BY order_id DESC';
}
2. Если поиск установлен, но сортировка не . Этот работает отлично:
if(isset($_POST['search_submit'])) {
$search_string = ' WHERE ' . $_POST['searchby'] . '= "' . $_POST['search_input'] . '" ';
}
if(!isset($_GET['sortby']) && isset($_POST['search_submit']) ){ //If the search is set but no sort
$sql = "SELECT *
FROM orders"
. $search_string .
"ORDER BY order_id DESC";
}
3. Если сортировка установлена, но поиск не . Этот работает нормально:
if(isset($_GET['sortby']) && !isset($_POST['search_submit'])) { //If the sort is set but no search
switch ($_GET['sortby']) {
case "order_id":
$sql = "SELECT *
FROM orders
ORDER BY order_id ASC";
break;
case "order_id_desc":
$sql = "SELECT *
FROM orders
ORDER BY order_id DESC";
break;
}
}
4. Если установлен поиск И сортировка. Все 3 из приведенных выше, если операторы работают, но последний доставляет мне проблемы.
if(isset($_GET['sortby']) && isset($_POST['search_submit'])) { //If the sort AND search is set
switch ($_GET['sortby']) {
case "order_id":
$sql = "SELECT *
FROM orders"
. $search_string .
"ORDER BY order_id ASC";
break;
case "order_id_desc":
$sql = "SELECT *
FROM orders"
. $search_string .
"ORDER BY order_id DESC";
break;
}
}
В результате вы можете выполнять поиск, но как только вы щелкнете по одному из заголовков столбцов и перезагрузите страницу с новой переменной GET, он избавится от текущей переменной POST, тем самым снова отобразив все результаты. Я попытался загрузить текущую переменную POST в сеанс после установки $ _POST ['search_submit'], а затем выполнить последний оператор if, чтобы проверить, установлена ли переменная сеанса, но в этом случае сеанс всегда устанавливается и если я попытаюсь вернуться на главную страницу, она сохранит результаты поиска.
Может быть, мне нужно где-то уничтожить сеанс? Возможно, в целом есть лучший подход к объединению функций сортировки и поиска?