2010-03-19 8 views
0

Je crée un ensemble de volets de recherche qui permettent aux utilisateurs de modifier leurs résultats après avoir soumis une requête. Nous tirons les valeurs courantes dans certains domaines des résultats et les affichons dans l'ordre de leur popularité - vous avez tous vu ce genre de chose sur eBay. Donc, si beaucoup de lignes dans nos résultats ont été créées en 2009, nous serons en mesure de cliquer sur "2009" et de voir uniquement les lignes créées cette année-là. À votre avis, quel est le moyen le plus efficace d'appliquer ces filtres? Ma solution de travail était de jeter les entrées des résultats qui ne correspondent pas aux arguments supplémentaires, tels que:Affinage des résultats de recherche [PHP/MySQL]

while($row = mysql_fetch_assoc($query)) { 
    foreach($_GET as $key => $val) { 
     if($val !== $row[$key]) { 
      continue 2; 
     } 
    } 
    // Output... 
} 

Cette méthode devrait, espérons que la base de données une fois interroger en effet, comme l'ajout de filtres ne change pas la requête - MySQL peut mettre en cache et réutiliser un ensemble de données. À la baisse, cela rend la pagination un peu mal à la tête.

L'alternative évidente serait de construire des critères supplémentaires dans la requête initiale, quelque chose comme:

$sql = "SELECT * FROM tbl MATCH (title, description) AGAINST ('$search_term')"; 
foreach($_GET as $key => $var) { 
    $sql .= " AND ".$key." = ".$var; 
} 

Y at-il de bonnes raisons de le faire à la place? Ou y a-t-il de meilleures options? Peut-être une table temporaire? Toutes les pensées ont beaucoup apprécié!

+0

J'utilise un système similaire avec tous les critères entrant dans la première requête ... ie tout ce qui pourrait être un filtre qui ne faisait pas partie de la requête initiale est dans ce même morceau de code, et est géré (ou pas géré) lors de la construction dynamique de la requête. Comme vous le dites, facilite la pagination et garde les choses au même endroit. – Tom

+0

Merci Tom! Si c'est en live j'aimerais voir ... – cantlin

Répondre

1

Je voudrais aller de l'avant et re-interroger la base de données, pour tout garder ensemble et pour réduire les cauchemars de pagination.

Faites-vous cela via AJAX?

+0

Merci pour votre réponse. Idéalement, je préférerais le système utilisé AJAX, mais pour le moment il nécessite un rafraîchissement de la page. – cantlin

1

L'utilisation du est-elle une option?

Si vous faites une grande quantité de requêtes (et je veux dire grand), l'utilisation du moteur de stockage de mémoire peut gagner du temps. (Bien que ce sera une petite quantité)

+0

Suggestion intéressante. Probablement exagéré dans une opération aussi petite que la mienne, mais ça pourrait marcher. Merci! – cantlin

Questions connexes