Как я могу сделать сортировку и поиск, используя переменные GET и POST? - PullRequest
0 голосов
/ 29 ноября 2009

В настоящее время я использую заголовки столбцов в качестве ссылок, которые при щелчке сортируют результаты по имени столбца, добавляя переменную 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, чтобы проверить, установлена ​​ли переменная сеанса, но в этом случае сеанс всегда устанавливается и если я попытаюсь вернуться на главную страницу, она сохранит результаты поиска.

Может быть, мне нужно где-то уничтожить сеанс? Возможно, в целом есть лучший подход к объединению функций сортировки и поиска?

Ответы [ 4 ]

3 голосов
/ 29 ноября 2009

Я бы порекомендовал изменить форму поиска с method="POST" на method="GET" и использовать только GET для всех ваших запросов. Если вы не можете изменить ваши запросы POST, вам нужно будет отправлять каждый запрос POST (включая сортировку), что потребует присоединения 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-адреса сортировки содержали правильные аргументы строки запроса для сохранения.

2 голосов
/ 29 ноября 2009

Попробуйте использовать только $_GET, включая $_POST кажется ненужным.

1 голос
/ 29 ноября 2009

Это код, который я использовал, чтобы переписать ссылку с переменными 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
}
1 голос
/ 29 ноября 2009

Не ответ на ваш вопрос, а только мой 0,2

В вашей ситуации я обычно выполняю сортировку на стороне клиента в веб-браузере, используя javascript. По сути, он предотвращает повторный запуск одного и того же запроса только с разными параметрами ORDER BY.

В jquery есть даже несколько очень хороших плагинов, которые делают его довольно простым.

пример: http://tablesorter.com/docs/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...