2009-12-15 8 views
0

J'essaie de créer un champ de recherche "avancé" pour les utilisateurs. (Les utilisateurs ont 5-8 champ pour court-circuiter la liste de recherche ..)Sql query - if instruction

Je pense que je dois construire la requête en fonction du champ affiché n'est pas vide.

Ceci est ma requête originale, mais avec cela, je me suis tout de suite table ..

$query = "select * from MYTABLE where FIELD1 LIKE '%$sample1%' OR FIELD2 LIKE '%$sample2%' OR FIELD3 LIKE '%$sample3%' OR FIELD4 LIKE '%$sample4%' order by name"; 

donc je pense que je dois utiliser l'instruction IF dans la requête, mais je ne sais pas comment, je suis erreur tout le temps. Et encore une chose: Si cet utilisateur remplit le "sample4", alors il doit remplir "sample1". Comment puis-je vérifier cela?

Nous vous remercions de votre aide.

+12

S'il vous plaît google « attaque par injection SQL » –

+0

Il est pas sûr qu'il est pas au courant de l'injection SQL , mais je suppose que vous avez raison, Mitch – Scoregraphic

+0

Sur quel SGBDR codez-vous? – Adrian

Répondre

0

Peut-être qu'il serait préférable de créer une requête qui inclut uniquement les contraintes de filtre que l'utilisateur a remplies, au lieu de toutes les inclure.

Si vous préférez suivre votre solution, vous pouvez utiliser SQL construire

CASE WHEN 

S'il vous plaît voir this pour MS SQL et this pour MySQL

+0

C'est exactement ce que je veux. "reate une requête qui inclut seulement le filtre ..." Mais je ne sais pas comment. – Holian

2

Vous pouvez également utiliser le tableau pour ce faire, il être plus organisé de cette façon. Pour chaque condition où vous les stockez dans un élément de tableau, et enfin les rejoindre lors de la génération du SQL.

<? 

$fields = array('field1', 'field2', 'field3'); 
// Changed this to 0, so it won't return all rows 
// but also the default array element prevent the statement to fail when 
// no search is being specified at all 
$wheres = array(0); 
foreach ($fields as $fieldname) { 
    // Get user input 
    $search = $_GET[$fieldname]; 
    // add condition to wheres if not empty 
    if (!empty($search)) { 
    $wheres[] = $fieldname . ' LIKE "%' . mysql_real_escape_string($search) . '%"'; 
    } 
} 

// Join the wheres conditions using OR, (or AND) 
$query = 'select * from MYTABLE where' . join(' OR ', $wheres); 

?> 
+1

Mais prenez soin de l'injection SQL, comme mentionné ci-dessus :-) – Zeemee

+0

j'aime ça, mais quelque chose ne va pas. Je suis toute la ligne de la table avec ce ... – Holian

+0

désolé, oui, de ma faute, je mets un 1 par défaut dans l'instruction de comparaison OR. Changer cela à 0 fera l'affaire. – Darkerstar

0

Vous pouvez essayer d'utiliser l'opérateur «n'est pas nul » comme ceci:

select * 
from mytable 
where 
(field1 is not null and field1 like '%test%') or 
(field2 is not null and field2 like '%test%') or 
(field3 is not null and field3 like '%test%') or 
(field4 is not null and field4 like '%test%') 
order by name 

Voir aussi Handling MySQL NULL Values