2010-05-03 6 views
2

C'est un peu urgent! J'essaie de faire une recherche de filtre simple où-par vous pouvez choisir parmi une série de 3 déroulants, puis sur la base de cela, les résultats sont alors affichés, Comment irais-je sur l'ajustement de la requête SQL pour chacun et par exemple, il peut y avoir l'URL avec une entrée telle que: url.com?location=gb&color=3&hair=4 et toujours former la requête SQL correcte pour quelque chose comme ceci: url.com?location=gb&hair=1 et ne pas rencontrer problèmes avec WHERE et AND etc etc et variables vides dans l'instructionAjustement de l'instruction sql dans une fonction basée sur l'entrée

Cela ne devrait pas être une fonction massive à vérifier en utilisant si voir comment les données sont définies pour toutes les possibilités?

Merci, Stefan

Répondre

1

je répondu à une question l'autre jour que je pense est assez semblable à la vôtre:

PHP: prepared statement, IF statement help needed

L'idée est que vous utilisez la logique conditionnelle dans votre code pour collecter termes au besoin correspondant aux entrées de votre application. Ensuite, vous les joignez ensemble de manière à produire la bonne expression SQL.

Il a besoin d'une fonction d'application pour construire dynamiquement l'expression SQL, et il existe des techniques pour la rendre aussi concise que possible. Si vous avez vraiment beaucoup de termes de recherche possibles, vous pourriez vous retrouver avec une longue fonction. Mais devinez quoi? Si vous avez des intrants complexes, il n'est pas surprenant que vous ayez besoin de code complexe pour les traiter.


Re votre commentaire:

url.com?location=gb & color = 3 & cheveux = 4

D'accord, vous avez jusqu'à trois entrées et vous devez construire dynamiquement une requête SQL à partir de ceux-ci. Commençons à la fin et travaillons à rebours. En fin de compte, vous voulez une expression SQL comme ceci:

WHERE (location = 'gb') AND (color = 3) AND (hair = 4) 

Si vous avez un tableau de trois termes, vous pouvez les joindre en PHP en utilisant la fonction implode(). Mais vous pouvez également avoir moins de trois. Vous pouvez gérer un certain nombre de termes en mettant beaucoup cependant termes que vous avez dans un tableau et les imploser avec AND entre chaque terme:

$where_array = array(
     "(location = 'gb')", 
     "(color = 3)", 
     "(hair = 4)" 
    ); 

$where_expr = "WHERE " . implode(" AND ", $where_array); 

Alors, comment voulez-vous créer le tableau avec ces termes? En écrivant le code à ajouter au tableau conditionnel pour chaque entrée qui est présente dans la demande actuelle de votre application:

$where_array = array(); 
if (array_key_exists("location", $_GET)) { 
    $location = mysql_real_escape_string($_GET["location"]); 
    $where_array[] = "(location = '$location')"; 
} 
if (array_key_exists("color", $_GET)) { 
    $color = mysql_real_escape_string($_GET["color"]); 
    $where_array[] = "(color = '$color')"; 
} 
if (array_key_exists("hair" $_GET)) { 
    $hair = mysql_real_escape_string($_GET["hair"]); 
    $where_array[] = "(hair = '$hair')"; 
} 

Après tout ce qui est fait, votre tableau a entre zéro et trois éléments. S'il en a un ou plusieurs, vous voulez générer une clause WHERE comme indiqué précédemment, sinon l'ignorer.

$where_expr = ''; 
if ($where_array) { 
    $where_expr = "WHERE " . implode(" AND ", $where_array); 
} 

Ajoutez ensuite $where_expr à votre requête SQL de base.

$sql .= $where_expr 

L'étoffe est environ $params pour les paramètres de requête, ce qui est une méthode alternative d'inclure des valeurs dynamiques dans une expression SQL, au lieu de mysql_real_escape_string(). Ce n'est pas obligatoire (et en fait l'ancienne extension mysql de PHP ne supporte pas les paramètres de requête) mais je vous recommande de passer à PDO pour pouvoir utiliser cette fonctionnalité. Voir l'exemple ici: PDO::prepare().

+0

Je dois être fatigué ... Hmmm je ne comprends pas les sections param, je suis encore relativement nouveau. et où() implode etc ... ma classe db ne gère pas beaucoup plus que la connexion et la réalisation d'appels de base tels que le retour de ligne et la requête. Pourriez-vous élaborer un peu plus s'il vous plaît? –

+1

N'essayez pas d'apprendre de nouvelles techniques de codage lorsque vous êtes trop fatigué pour vous concentrer. Tu ferais mieux de dormir et d'y revenir quand tu seras frais. –

+1

Tout est logique après avoir dormi une nuit! merci pour votre explication plus approfondie! :) –

1

Voici mon aller à elle:

// discard empty values and unwanted keys 
$get = array_intersect_key(array_filter($_GET, 'strlen'), array_flip(array('location', 'color', 'hair'))); 

foreach ($get as $key => $value) 
{ 
    $get[$key] = $key . ' = ' . mysql_real_escape_string($value); 
} 

$sql .= ((count($get) == 0) ? null : ' WHERE ') . implode(' AND ', $get); 

Je ne l'ai pas testé, mais il devrait bien fonctionner.

+0

Cela ressemble aussi à une bonne méthode, encore moins de code mais j'ai accepté la réponse ci-dessus en raison de son explication en profondeur –

+0

Oui +1 mais j'ai utilisé le code plus verbeux pour montrer chaque étape plus clairement. En outre, il est facile d'utiliser une sous-expression différente pour chaque entrée. –

Questions connexes