Как я могу выполнить сортировку и поиск, используя переменные GET и POST?
Вопрос
В настоящее время я использую заголовок столбца в качестве ссылок, которые при нажатии сортируют результаты по имени столбца, добавляя переменную 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 работают, но последнее вызывает у меня проблемы.
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, чтобы увидеть, установлена ли переменная сеанса, но тогда происходит то, что сеанс всегда установлен, и если я попытаюсь вернуться на домашнюю страницу, он сохранит эти результаты поиска.
Возможно, мне нужно где-то уничтожить сеанс?Возможно, есть в целом лучший подход, который я мог бы использовать для объединения функций сортировки и поиска?
Решение
Я бы рекомендовал изменить форму поиска с method="POST"
Для method="GET"
и используйте just GET для всех ваших запросов.Если вы не можете изменить свои запросы на публикацию, вам нужно будет ПУБЛИКОВАТЬ каждый запрос (включая сортировку), для чего потребуется javascript, прикрепленный к вашим ссылкам на сортировку.
Преимущество использования GET заключается в том, что ваши пользователи могут добавлять в закладки определенные поисковые запросы, поскольку все данные будут содержаться в строке запроса.
Редактировать:Сохранение строк поиска в последующих запросах:
Я бы абстрагировал ваш код сортировки от чего-то подобного:
<?php
function write_sortable_header_link( $column_id, $column_name ){
if( ( isset($_GET['sortby']) && $_GET['sortby'] != $column_id ) || !isset($_GET['sortby']) )
$query = "?sortby=$column_id";
else
$query = '?sortby='.$column_id.'_desc';
if( isset($_GET['searchsubmit']) ){
$query .= '&searchsubmit=1';
$query .= '&searchby=' . urlencode( isset($_GET['searchby']) ? $_GET['searchby'] : '' );
$query .= '&search_input=' . urlencode( isset($_GET['search_input']) ? $_GET['search_input'] : '' );
}
$href = $_SERVER['SCRIPT_NAME'] . $query;
echo "<a href='$href'>$column_name</a>";
}
?>
Тогда вы бы назвали это так:
<?php write_sortable_header_link( 'order_id', 'Order Id' ); ?>
Это позволило бы убедиться, что ваш URL-адрес сортировки содержит правильные аргументы строки запроса для сохранения.
Другие советы
Попробуйте использовать $_GET
только с участием $_POST
кажется ненужным.
Не ответ на ваш вопрос, а всего лишь мои 0.2
В вашей ситуации я обычно выполняю сортировку на стороне клиента в веб-браузере, используя javascript.Это предотвращает повторение по существу одного и того же запроса снова и снова, только с разными параметрами ORDER BY.
В jquery есть даже несколько очень хороших плагинов, которые делают это довольно простым.
пример: http://tablesorter.com/docs/
Это код, который я в конечном итоге использовал, чтобы переписать ссылку с помощью переменных sort и search get, как предложил dcneiner.Я удалил urlencode, переключил & на знак '&' и сделал встроенное выражение if читаемым только как get переменная, поскольку единственный способ установить эти get переменные - это установить search_submit, поскольку они являются частью одной и той же формы.Я также добавил '{' и '}' обратно в операторы if и else.Я предполагаю, что вы используете немного другой способ работы с PHP?Видите ли вы что-нибудь неправильное или небезопасное в внесенных мной изменениях?Я не был слишком уверен, почему ты поступил по-своему.Но еще раз спасибо.
function write_sortable_header_link( $column_id, $column_name ){ //Function that creates a link with the search query if needed
if( ($_GET['sortby'] != $column_id) || !isset($_GET['sortby']) ) { //If the GET variable is not the column id of this button or if the GET sortby variable has not been set
$query = "?sortby=$column_id"; //then add this to the end of the url
} else {
$query = '?sortby='.$column_id.'_desc'; //otherwise if the GET variable is the column id of this button, then add the descending code to the end of the variable
}
if(isset($_GET['search_submit']) ){ //If the GET variable search_submit is in the url
$query .= '&search_submit=1'; //then add this to the end of the url string
$query .= '&searchby=' . $_GET['searchby']; //add whatever is currently in the GET searchby to the end of the url string
$query .= '&search_input=' . $_GET['search_input']; //add whatever is currently in the GET search_input to the end of the url string
}
$href = $_SERVER['SCRIPT_NAME'] . $query; //this is the href part of the link
echo "<a href='$href'>$column_name</a>"; //this creates the actual link
}