2010-07-03 5 views
1

Je laisse les utilisateurs chercher dans ma base de données pour les données par ville. Ma requête ressemble:Rechercher mySQL avec PHP, en utilisant un caractère générique WHERE ou une instruction IF?

$results = mysql_query("SELECT * FROM mydb WHERE City='".$city."' LIMIT 10");

Je veux un utilisateur pour pouvoir rechercher « toutes les villes », donc je voudrais soit supprimer l'instruction WHERE si la ville $ == « toutes les villes »; ou utilisez un caractère générique pour l'instruction WHERE correspondant à toutes les villes de la base de données. J'avais l'habitude d'avoir une instruction IF qui basculait entre deux requêtes, mais je veux ajouter plus de filtres comme pays/tous les pays, code postal/tous les codes postaux, etc, donc je préfère garder une requête SQL dynamique.

+0

avertissement obligatoire de prendre 'city' de $ de l'entrée utilisateur: http://xkcd.com/327/ – egrunin

Répondre

2

Eh bien, vous pouvez toujours avoir une seule requête et construire la clause where dynamiquement, en tant que tel:

$where = ''; 

// conditional statements (if/else, switch) for populating the where clause 
$where .= " WHERE City = '{$city}'"; 
$where .= " AND Country = '{$country}'"; 

$results = mysql_query("SELECT * FROM mydb{$where} LIMIT 10"); 
+0

Excellent, exactement ce que je cherchais! –

0

Une façon serait une déclaration de cas:

WHERE City = case when '$city' = 'All cities' then City else '$city' end 

Si l'utilisateur recherche « Toutes les villes », ce fait tourner la clause WHERE dans:

WHERE City = City 

Ce qui est toujours vrai (à moins pour les villes non nulles;))

PS Assurez-vous que vous exécutez ces requêtes à l'aide d'un compte MySQL en lecture seule. L'utilisateur pourrait entrer des choses drôles dans le paramètre $city!

+0

En ce qui concerne votre dernier commentaire: Pour bloquer les choses amusantes, utilisez simplement les instructions préparées ou les fonctions d'échappement appropriées. Bien sûr, un compte MySQL en lecture seule ne peut pas nuire non plus. –

0

Vous pouvez essayer

WHERE City like '$city' 

et permettre aux utilisateurs d'entrer des caractères génériques, si vous pensez qu'ils seraient à la hauteur.

0

mais pas programmeur PHP, ce pourrait offrir une pseudocode option ... construire conditionnellement votre clause where . De plus, je le ferais avec des requêtes paramétrées au lieu de construire directement des chaînes pour éviter les attaques par injection SQL.

cYourSQL = "select * from YourTable where " 

cAndRequired = "" 

if city is NOT "all cities" 
    cYourSQL = cYourSQL + cAndRequired + " city = 'YourParameterValueProvided' " 
    cAndRequired = " AND " 
endif 

Maintenant, toujours ajouter votre sélection de pays

cYourSQL = cYourSQL + cAndRequired + " country = 'YourCountryValue' LIMIT 10 " 

Exécutez la requête

Questions connexes