2009-09-20 8 views
1

Donc, en essayant de trouver un script qui peut me lancer avec la création d'un panneau de recherche qui sera une forme, j'espère que quelque chose de proche de ce qu'Ebay a à le moment. Alors que je sais que cela va être une forme et en utilisant la méthode GET, je ne trouve pas un script qui peut analyser une URL pour plusieurs paramètres et mettre à jour la requête de manière dynamique.Requête dynamique basée sur plusieurs variables GET (Refine Search Form)

Je ne sais pas exactement comment faire cela sans un million et un si les déclarations. (Environ 10 ou si possible des variables GET mais pourrait être beaucoup plus rapidement.)

donc je besoin d'un simple:

  • foreach GET add WHERE field=GET[variable]

les scripts prêts à l'emploi que vous connaissez?

Répondre

3

Je ne connais pas de script en conserve pour ce faire.

Mais c'est assez facile de l'écrire vous-même.

<?PHP 
    $valid_fields = array('field1','field2',...'fieldN'); 

    $where = "WHERE 1=1 "; 

    foreach($valid_fields as $fname){ 
     if (! empty($_GET[$fname])){ 
      $where .= " AND $fname='" . mysql_real_escape_string($_GET[$fname]) ."'"; 
     } 
    } 

Ce code boucles simplement sur vos variables d'entrée attendues, et si elles sont passées comme paramètre dans $ _GET, annonces d'une ET à la clause WHERE.

Ensuite, vous virer de bord juste le $ où sur la fin de votre requête (quel qu'il soit):

$sql = 'SELECT * FROM some_table ' . $where; 

Modifier pour exemple de code pour cacher les noms de colonnes:

<?PHP 
//keys are parameter names in _GET, values are database column names. 
$fieldmap = array(
'fname'=>'first_name', 
'lname'=>'last_name' 
); 

$where = '1=1 '; 

foreach($fieldmap as $get_name => $col_name){ 
    if (! empty($_GET[$get_name])){ 
    $where .= " AND $col_name = '" . mysql_real_escape_string($_GET[$get_name]) . "'"; 
    } 
} 
?> 
+0

vraiment très très bon, mais ce qui expose mes noms de table qui je ne suis pas trop satisfait! n'importe quelle chance je pourrais les masquer avec un autre tableau comme le $ valid_fields alors GET [nom] deviendrait GET [n'importe où] – bluedaniel

+1

Vous pourriez utiliser un autre tableau associatif ...So $ mask = array ('url_name' => 'nom_table'); Ensuite, au lieu d'utiliser $ _GET ['nom_table'], vous utiliserez $ mask [$ _ GET ['url_name']; – BraedenP

+0

oh vous m'avez perdu un peu là, pas tout à fait sûr comment mettre cela sur la page, les tableaux récursifs me déroutent un peu en termes de formatage, une chance que vous pouvez me montrer dans une réponse afin que je puisse voir le formatage? merci pour cette aide en passant! – bluedaniel

0

Je sais presque rien sur PHP, mais il y a une discussion sur la récupération et l'analyse syntaxique ici la chaîne de requête (défilement vers le bas un peu):

http://us2.php.net/manual/en/reserved.variables.get.php

Vous pouvez probablement soulever un code utile de là pour extraire tous vos paramètres GET et les utiliser pour construire votre clause WHERE. Je ne suis pas sûr de la façon dont votre modèle de données est configuré, donc je ne peux pas donner de conseils détaillés à ce sujet - outre les conseils habituels de désinfecter toutes vos entrées de sorte que vous ne vous retrouviez pas avec un Bobby Tables.

0

Vous voulez dire quelque chose comme ça? Cela fera une boucle dans votre tableau $ _GET, en ajoutant des chaînes de type clé = 'valeur' ​​à la chaîne de requête. Ensuite, une fois que vous avez terminé de récurser dans le tableau, vous pouvez faire ce que vous voulez avec la chaîne de requête complète.

Comme d'habitude, utilisez les fonctions de désinfection standards que vous collectez vos entrées (strip_slashes, mysql_real_escape_string, etc.)

+0

-1 parce que vous faites la promotion des vulnérabilités de l'injection SQL. – timdev

+0

La dernière phrase de ma réponse indique explicitement que je n'ai inclus aucune fonction d'assainissement. – BraedenP

+0

gah. Désolé pour ça. faire une autre modification afin que je puisse supprimer la downvote. – timdev

Questions connexes