Question

J'utilise actuellement l'en-tête de colonne comme liens qui, une fois cliqué, trieront les résultats en fonction du nom de la colonne en ajoutant une variable get à l'URL. Voici un exemple:

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

J'ai également un formulaire dans lequel les utilisateurs peuvent entrer, choisir une catégorie dans une zone de sélection, puis saisir un terme de recherche. J'utilise des instructions if et des instructions switch pour vérifier si la variable $ _GET ['sortby'] et la variable $ _POST ['search_submit'] sont définies et si oui, pour exécuter une instruction SQL donnée en fonction de la valeur de la variable GET .

Il existe 4 scénarios différents.

1. Valeur par défaut: si ni le tri ni la recherche ne sont définis . Celui-ci fonctionne 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 recherche est définie mais que le tri n'est pas . Celui-ci fonctionne 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 le tri est défini, mais que la recherche n’est pas . Celui-ci fonctionne 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 la recherche ET le tri sont définis. Les trois des options ci-dessus si les instructions fonctionnent, mais le dernier me pose des problèmes.

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

Ce qui se passe, c’est que vous pouvez effectuer une recherche, mais dès que vous cliquez sur l’un des en-têtes de colonne et que la page est rechargée avec la nouvelle variable GET, elle supprime la variable POST actuelle et affiche à nouveau tous les résultats. J'ai essayé de charger la variable POST actuelle dans une session après le isset $ _POST ['search_submit'], puis de vérifier si la dernière instruction if vérifie si la variable de session est définie, mais ce qui se passe alors, c'est que la session est toujours définie et Si j'essaie de revenir à la page d'accueil, les résultats de recherche seront conservés.

Peut-être dois-je détruire la session quelque part? Peut-être pourrais-je adopter une meilleure approche pour combiner les fonctions de tri et de recherche?

Était-ce utile?

La solution

Je vous conseillerais de remplacer le formulaire de recherche de method="POST" par method="GET" et d'utiliser uniquement GET pour toutes vos demandes. Si vous ne pouvez pas modifier vos demandes POST, vous devrez POST chaque demande (y compris le tri), ce qui nécessitera que javascript soit attaché à vos liens de tri.

L'avantage de l'utilisation de GET est que vos utilisateurs peuvent ajouter des favoris à des recherches spécifiques car toutes les données seraient contenues dans la chaîne de requête.

MODIFIER : conserver les chaînes de recherche dans les requêtes suivantes:

Je voudrais résumer votre code de tri en quelque chose comme ceci:

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

Vous l'appelleriez alors comme ceci:

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

Cela garantirait que votre URL de tri contienne les arguments de chaîne de requête corrects pour la persistance.

Autres conseils

Essayez d’utiliser uniquement $_GET, car $_POST semble inutile.

Ce n'est pas une réponse à votre question, mais juste mon 0,2

Dans votre cas, je trie généralement le côté client dans le navigateur Web à l'aide de javascript. Cela empêche essentiellement la même requête d'être exécutée encore et encore avec seulement des paramètres ORDER BY différents.

Avec jQuery, il existe même de très bons plugins qui le rendent assez facile.

exemple: http://tablesorter.com/docs/

C’est le code que j’ai utilisé pour faire réécrire le lien avec le tri et rechercher les variables comme suggéré par dcneiner. J'ai sorti le code urlencode, l'ampli & Commuté; au '& amp;' signe et fait en sorte que l'instruction inline if soit lue uniquement comme variable get, car le seul moyen de les définir est que search_submit est défini, car ils font partie du même formulaire. J'ai également ajouté les '{' et '}' dans les déclarations if et else. Je suppose que vous utilisez une façon légèrement différente de faire PHP? Voyez-vous quelque chose de mal ou d'incertain dans les modifications que j'ai apportées? Je ne savais pas trop pourquoi tu l'avais fait à ta façon. Mais merci encore.

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top