2010-10-02 7 views
2

D'accord, je voudrais des conseils sur la façon de coder une recherche avancée pour les profils de la bonne façon.PHP: Codage "recherche avancée" la meilleure façon

La recherche « avancée » contient:

Gender female/both/male 
Search in All/latest profiles 1/2/7/14/32 days ago 
Online: Yes(checked) 
Age (xx) to (xx) years (xx means you can write e.g 12 and 18) 
Cities: all/city1/city2/city3 

Il y a beaucoup de critères que vous pouvez choisir.

Je voudrais savoir comment je devrais coder ceci de la manière la plus efficace, avec le moins de répétition de code. Dois-je créer une requête à partir de ce que l'utilisateur a choisi? Exemple:

$query = "SELECT * FROM users WHERE" 
if(!empty($gender){ // if its empty, then the user chose both.. 
    $query .= "gender = $gender"; 
} 
.... 

Ou existe-t-il de meilleures solutions? Je pense que cela entraînera des problèmes, car si un utilisateur ne choisit aucun genre, et un autre si $ online (exemple) commence par AND, il en résultera O WH ET ..

Répondre

0

Je pense que votre solution est bonne début. Continuez à vérifier vos champs de recherche avancée et construit votre clause SQL où nécessaire.

Le problème viendra si vous avez besoin de faire de la logique floue - Males OR City1. Mais vous n'avez pas indiqué cela dans votre OP.

Pour éviter WHERE AND il suffit de commencer votre clause where avec une véritable expression:

$query = "SELECT * FROM users WHERE 1" 

Ce sera toujours évaluée à true et quand vous ajoutez des conditions dans lesquelles ils ajoutera correctement - SELECT * FROM users WHERE 1 AND city = 'city1'

0

Le « et "problème est assez facile à résoudre:

$andArr[] = "gender = $gender"; 
$andArr[] = "age between $from and $to"; 
... 

$adsString = implode(' AND ', $andArr); 

Pour le genre je voudrais utiliser une liste déroulante avec" les deux "comme présélectionné.

+0

S'il vous plaît ne pas utiliser des variables non initialisées comme andArr. De plus, je suis jolie, il ne devrait pas y avoir d'accolades après $ andArr dans la dernière ligne. Édité. – phihag

+0

c'est juste un extrait de code. Normalement j'initialise tout mon variablse. $ andArr = array(); serait avant mon $ andArr [] = ...; – ITroubs

+0

Que fait imploser? si je fais écho à la chaîne, serait-ce que gender = $ gender ET age entre $ from et $ to? – Johnson

-1

Veuillez ne pas écrire le code qui permet SQL injections. Assurez-vous également que votre code php fonctionne avec register_globals set to off. En dehors de cela, je ne pense pas qu'il y ait une raison pour que cela ne fonctionne pas de cette façon.

Voici donc un exemple simple, en utilisant PDO:

$query = 'SELECT * FROM users WHERE 1'; 
$params = array(); 
if (!empty($_POST['gender'])) { 
    $query .= ' AND gender=:gender' 
    $params[':gender'] = $_POST['gender']; 
} 
... 
$st = $pdo->prepare($query); 
$result = $st>execute($params); 
+1

si je viens d'ajouter "WHERE 1" à la requête start $ dans l'exemple que j'ai obtenu ci-dessus, permet-il des injections sql? – Johnson

+0

mon registerglobal est désactivé – Johnson

+0

@ user457827 J'ai simplement supposé que $ gender serait l'entrée directe de l'utilisateur (et cela nécessite register_globals). Si vous faites du prétraitement de toute façon, il est sûr que ce prétraitement soit correct. Fondamentalement, la seule façon de s'assurer que c'est cela est d'utiliser une fonction de sécurité telle que intval ou de la vérifier par rapport à une liste codée en dur des valeurs possibles. Puisqu'il est si facile de bousiller là-bas, j'utiliserais des états préparés tout le temps. – phihag

Questions connexes