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()
.
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? –
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. –
Tout est logique après avoir dormi une nuit! merci pour votre explication plus approfondie! :) –