Pregunta

Actualmente estoy usando encabezados de columna como enlaces que, al hacer clic en ellos, ordenarán los resultados por el nombre de la columna agregando una variable de obtención a la URL.Aquí hay un ejemplo:

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

También tengo un formulario donde los usuarios pueden ingresar, seleccionar una categoría de un cuadro de selección y luego ingresar un término de búsqueda.Estoy usando declaraciones if y switch para verificar si la variable $_GET['sortby'] y la variable $_POST['search_submit'] están configuradas y, de ser así, ejecutar una determinada declaración SQL basada en el valor de la variable GET. .

Hay 4 escenarios diferentes.

1.Por defecto:Si no se establece ni ordenar ni buscar.Éste funciona bien:

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.Si la búsqueda está configurada pero la clasificación no.Éste funciona bien:

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.Si se establece la clasificación, pero no la búsqueda.Éste funciona bien:

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.Si se establece la búsqueda Y clasificación. Las 3 declaraciones anteriores funcionan, pero la última me está 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; 
  }
} 

Lo que sucede es que puedes buscar, pero tan pronto como haces clic en uno de los encabezados de columna y recarga la página con la nueva variable GET, eliminará la variable POST actual, mostrando así todos los resultados nuevamente.Intenté cargar la variable POST actual en una sesión después de que se estableció $_POST['search_submit'] y luego verifiqué la última declaración if para ver si la variable de sesión está configurada, pero lo que sucede entonces es que la sesión siempre está configurada y Si intento volver a la página de inicio, se mantendrán los resultados de la búsqueda.

¿Quizás necesito destruir la sesión en alguna parte?¿Quizás exista un mejor enfoque general que podría adoptar para combinar funciones de clasificación y búsqueda?

¿Fue útil?

Solución

Recomendaría cambiar el formulario de búsqueda de un method="POST" a method="GET" y use solo GET para todas sus solicitudes.Si no puede cambiar sus solicitudes POST, necesitará PUBLICAR cada solicitud (incluida la clasificación), lo que requerirá que se adjunte JavaScript a sus enlaces de clasificación.

El beneficio de usar GET es que sus usuarios pueden marcar búsquedas específicas ya que todos los datos estarían contenidos en la cadena de consulta.

EDITAR:Conservar las cadenas de búsqueda en solicitudes posteriores:

Resumiría su código de clasificación a algo como esto:

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

Entonces lo llamarías así:

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

Se aseguraría de que las URL de clasificación contengan los argumentos de cadena de consulta correctos para la persistencia.

Otros consejos

Intente utilizar $_GET solamente, lo que implica $_POST parece innecesario.

No es una respuesta a tu pregunta, sino solo mi 0.2

En su situación, generalmente ordeno el lado del cliente en el navegador web usando javascript. Impide esencialmente que la misma consulta se ejecute una y otra vez con solo diferentes parámetros ORDER BY.

Con jquery hay incluso algunos complementos muy agradables que lo hacen bastante fácil.

ejemplo: http://tablesorter.com/docs/

Este es el código que terminé usando para hacer que el enlace se reescribiera con la ordenación y búsqueda de obtener variables como lo sugiere dcneiner. Saqué el urlencode, el amplificador & Conmutado; al amplificador '&; firmó e hizo que la instrucción if en línea se leyera solo como la variable get, ya que la única forma en que esas variables get se pueden establecer es si search_submit se establece ya que son parte de la misma forma. También agregué el '{' y '}' nuevamente en las declaraciones if y else. ¿Supongo que estás usando una forma ligeramente diferente de hacer PHP? ¿Ves algo incorrecto o inseguro sobre los cambios que hice? No estaba muy seguro de por qué lo hiciste a tu manera. Pero gracias de nuevo.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top