PHP & MYSQL: построение запроса на основе нескольких входных значений от пользователей - PullRequest
1 голос
/ 04 сентября 2010

Гипотетически у меня три таблицы: * рецепты - содержит рецепты * ингредиенты - список предметов * питание - список блюд

У меня есть форма, которая генерирует выбор как:

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

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

Я хочу, чтобы пользователь мог выбирать из одного или ни одного из вышеперечисленных, то есть он может выбирать яблоки ИЛИ вишню ИЛИ (бананы и обед)

Когда я запрашиваю MySQL, мой запрос примерно равен

select recipes.* from recipes

или

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

или

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');

Есть ли хороший способ сказать (в PHP), существует ли этот массив (то есть is_array (ингридиенты) добавить к запросу таблицу (ингридиенты) и в конце добавить (".ingredients.list in ('apple') )) ...

без необходимости записывать все возможные комбинации или возможные входные данные (т. Е. Пользователь, выбранный из списка ингредиентов, или из списка ингредиентов и блюд, или из списка)?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2010

Вы должны создать два массива для возможных таблиц и частей, а затем выполнить запрос, который собирает все:

$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 голосов
/ 04 сентября 2010

Я не вижу здесь «всех возможных комбинаций или возможных вводов», а только всех возможных вводов.
Я бы проверил все возможные вводы и добавил бы их в запрос, если они заполнены.

0 голосов
/ 04 сентября 2010

Существует несколько подходов к решению этой проблемы.

Если вы хотите узнать, существует ли ключ в массиве, вы можете использовать array_key_exists

...