Как я могу выполнить сортировку и поиск, используя переменные GET и POST?

StackOverflow https://stackoverflow.com/questions/1814544

Вопрос

В настоящее время я использую заголовок столбца в качестве ссылок, которые при нажатии сортируют результаты по имени столбца, добавляя переменную 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 .= '&amp;searchsubmit=1';
     $query .= '&amp;searchby=' . urlencode( isset($_GET['searchby']) ? $_GET['searchby'] : '' );
     $query .= '&amp;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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top