2010-09-04 26 views
1

Hypothétiquement I trois tables: * recettes - contient des recettes * ingrédients - liste des articles * repas - Liste des repasPHP et MYSQL: la construction d'une requête basée sur des valeurs d'entrée multiples des utilisateurs

J'ai une forme qui génère une sélection comme:

Choose what ingredients you have: 
- apples 
- bananas 
- cherries 

Choose the meal this is for: 
- breakfast 
- lunch 
- dinner 

Je veux que l'utilisateur soit en mesure de choisir l'un ou aucun de ces éléments, à savoir qu'ils peuvent choisir des pommes ou de cerises oU (bananes & & déjeuner)

Quand je requête MySQL ma requête est à peu près

select recipes.* from recipes 

ou

select recipes.* from recipes, ingredients 
where recipes.id= ingredients.id and ingredients.list in ('apple'); 

ou

select recipes.* 
from recipes, ingredients, meal 
where recipes.id= ingredients.id 
     and ingredients.list 
     and ingredients.id = meals.id 
     and ingredients.list ('apple') 
     and meals.list in ('lunch'); 

est-il un bon moyen de dire (en PHP) si ce tableau existe (c'est à dire is_array (ingrédients) ajouter à la requête la table (ingrédients) et à la fin tack sur (".ingredients.list in ('pomme')) ...

sans avoir à écrire toutes les combinaisons possibles ou entrées possibles (à savoir l'utilisateur du sélectionné dans la liste des ingrédients ou dans la liste des ingrédients et des repas, ou d'aucune liste)?

+0

+1 pour une question bien formatée, en particulier pour un nouvel utilisateur! Voulez-vous essentiellement des «critères de recherche» - pour tirer «toutes les recettes impliquant des pommes» et «toutes les recettes de déjeuner impliquant des bananes», etc? –

+0

Avez-vous envisagé d'utiliser un ORM? Cela vous permettra de construire une requête dynamique avec très peu d'effort. – DrColossos

+0

pas si bien. En fait, il est difficile de lire une très longue ligne –

Répondre

0

Il existe plusieurs approches pour faire face à ce sujet.

Si vous voulez savoir si une clé existe dans un tableau que vous pouvez utiliser array_key_exists

+0

Je n'ai pas besoin de savoir si une clé existe, juste si le tableau est là, et si le tableau est là, modifiez la chaîne de requête. – Ryank

0

Vous devez créer deux tableaux pour les tables possibles et les segments, puis faire la requête à tout rassembler:

$wheres=array(); 
$tables=array(); 
if(isset($_POST['ingredients'])) { 
    $tables[]='ingredients'; 

    $ingredients=array_map('mysqL_real_escape_string', $_POST['ingredients']); 
    $wheres[]='ingredients.list IN (\''. join(', ', $ingredients). '\')'; 
    //add other wheres if you want 
} 
if(isset($_POST['meals'])) { 
    $tables[]='meal'; 

    $meals=array_map('mysqL_real_escape_string', $_POST['meals']); 
    $wheres[]='meals.list IN (\''. join(', ', $ingredients). '\')'; 
    //add other wheres if you want 
} 

if(!$tables) { 
    echo 'You have not chose anything!'; 
} else { 
    $query = 'SELECT * FROM '. join(',', $tables). ' WHERE '. join(' AND ', $wheres); 
    //do other stuff.. 
} 
+0

C'est cool - mais ça ne va pas bien, disons que je pourrais potentiellement retourner 5 tableaux qui modifieraient tous la requête ... – Ryank

+0

dans ce cas faire un tableau qui saisit les variables d'entrée $ _POST acceptables, et avoir chacun de leurs values: ''meals' => array ('table' => 'repas', 'nom de champ' => 'repas')', par exemple. et avec une petite boucle simple, vous bouclez ce tableau et créez votre requête. Une fois que vous voulez modifier, ajoutez un nouvel élément à ce tableau. N'est-ce pas plus cool :) – aularon

0

Je ne vois pas ici "toutes les combinaisons possibles ou entrées possibles" mais seulement toutes les entrées possibles.
Je vérifie toutes les entrées possibles et les ajoute à la requête si rempli.

+0

Je pense que je pourrais utiliser sprintf() et le modifier, mais j'espérais une solution plus évolutive et élégante. – Ryank

+0

@Ryank essayez votre "5 nouveaux tableaux" et vous verrez qu'il est impossible de le faire automatisé. Chaque paramètre nécessite son propre traitement. Toutes les conditions ne peuvent pas être écrites comme un simple contrôle d'égalité, mais d'autres peuvent utiliser 'between',' less than', 'greater than',' like' et autres. Pré-définir toutes vos conditions EST élégant. Ne pas prédire l'utilisation future basée sur un exemple stupide.Essayez d'UTILISER ce problème plus complexe en premier. Et seulement alors chercher une solution –