Pergunta

Atualmente, estou usando cabeçalho da coluna é como links que, quando clicado irá classificar os resultados pelo nome da coluna, adicionando uma variável get para a url. Aqui está um exemplo:

<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>

Eu também tenho um formulário onde os usuários podem inserir escolher uma categoria de um selectbox e insira um searchterm. Eu estou usando se declarações e declarações switch para verificar se o $ _GET [ 'SortBy'] variável e os US $ _ POST [ 'search_submit'] variável é definida e se assim for, para executar uma determinada instrução SQL com base no valor da variável GET .

Existem 4 cenários diferentes.

1. Padrão: Se nenhum tipo, nem de pesquisa é definido . Este funciona muito bem:

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. Se a pesquisa estiver definida, mas o tipo não é . Este funciona muito bem:

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. Se o tipo for definido, mas a busca não é . Este funciona muito bem:

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. Se a pesquisa e classificar está definido. Todos os 3 dos acima if trabalho, mas o último está me dando problemas.

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; 
  }
} 

O que acontece é que você pode procurar, mas assim que você clicar em um dos cabeçalhos de coluna e ele recarrega a página com a nova variável GET, ele vai se livrar da variável POST atual, mostrando assim todos os resultados novamente. Tentei carregar a variável POST atual em uma sessão após o $ _ POST [ 'search_submit'] isset e, em seguida, fazer o último caso de verificação declaração para ver se a variável de sessão está definido, mas o que acontece então é que a sessão é sempre definido e se eu tentar voltar para a página inicial, ele irá manter os resultados da pesquisa.

Talvez eu preciso para destruir a algum lugar sessão? Talvez haja uma abordagem global melhor do que eu poderia tomar para combinar classificar e procurar recursos?

Foi útil?

Solução

Eu recomendaria mudar o formulário de busca a partir de um method="POST" para method="GET" e uso apenas obter para todos os seus pedidos. Se você não pode mudar suas solicitações POST, você está indo para necessidade de POST cada solicitação (inclusive a selecção), o que exigirá javascript ligado a suas ligações de classificação.

A vantagem de se utilizar GET é que os usuários podem marcar pesquisas específicas uma vez que todos os dados seriam contidos na cadeia de consulta.

Editar : Mantendo as seqüências de pesquisa em solicitações subseqüentes:

Eu faria abstrair seu código de classificação para algo como isto:

<?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>";
}
?>

Você, então, chamá-lo assim:

<?php write_sortable_header_link( 'order_id', 'Order Id' ); ?>

Seria garantir que seus classificação de URL conter os argumentos de cadeia de consulta correta para persistência.

Outras dicas

Tente usar apenas $_GET, envolvendo $_POST parece desnecessária.

Não é uma resposta à sua pergunta, mas apenas a minha 0,2

Na sua situação eu costumo fazer o lado do cliente triagem no navegador web usando javascript. Ele impede essencialmente a mesma consulta atropelamento e outra vez com apenas ordem diferente por parâmetros.

com jQuery há mesmo alguns muito bons plugins que o tornam muito fácil.

Exemplo: http://tablesorter.com/docs/

Este é o código que eu acabei usando para fazer a reescrita ligação com o tipo e procurar obter variáveis ??como sugerido por dcneiner. Tirei o urlencode, o comutada e ao sinal '&' e fez a linha se comunicado lido como apenas a variável get, já que a única maneira essas variáveis ??get pode ser definido é se o search_submit está definido desde que eles são parte de a mesma forma. Eu também acrescentou a volta '{' e '}' para o if e else. Eu estou supondo que você está usando uma maneira ligeiramente diferente de fazer PHP? Você vê nada de errado ou inseguro sobre as alterações que fiz? Eu não estava muito certo porque você fez isso à sua maneira. Mas obrigado novamente.

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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top