Я по-прежнему новичок в PHP, и я немного узнал от сообщества, но мне еще многое предстоит узнать, и я надеялся, что вы, ребята, можете дать мне совет по этому вопросу.
Мой вопрос – о выпадающих меню. В настоящее время у меня есть раскрывающееся меню, которое извлекает информацию из таблицы. Информация отображает ингредиенты, которые я могу выбрать из выпадающего меню. Теперь я хочу иметь возможность использовать эти ингредиенты для поиска рецептов в моей таблице рецептов, но я не знаю, как это сделать.
Таблица моих ingredients
содержит два поля.
ingredient id
и recipe id
Моя таблица recipe
содержит два поля
recipe id
и recipe name
Таблица recipeingredients
которая представляет собой составной ключ, имеет два поля
recipe id
и ingredient id
Мой HTML-код ниже – выпадающее меню
<form id="searchForm"> <form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="GET"> <h3> Search your recipe here </h3> <fieldset> Ingredient 1:<select name= "dropdown1" id = "drop1"/> <?php while ($line = mysql_fetch_array($result1, MYSQL_ASSOC)) { ?> <option value="<?php echo $line['ingredientname'];?>"> <?php echo $line['ingredientname'];?> </option> <?php } ?> </select> Ingredient 2:<select name = "dropdown2" id = "drop2"/> <?php while ($line = mysql_fetch_array($result2, MYSQL_ASSOC)) { ?> <option value="<?php echo $line['ingredientname'];?>"> <?php echo $line['ingredientname'];?> </option> <?php } ?> <input type="submit" value="Go!" /> <input type="submit" value="Search" /> </form>
У меня такое чувство, что мне может понадобиться присоединиться, но, как я уже сказал, я новичок в этом, поэтому, пожалуйста, будьте осторожны.
Вот как я это сделаю. Схема первая:
CREATE TABLE ingredients ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(40) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE recipe ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(40) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE recipe_ingredients ( recipe_id INTEGER, ingredient_id INTEGER );
Теперь для запроса. Все рецепты, содержащие нумерованный ингредиент:
SELECT recipe.name FROM recipe INNER JOIN recipe_ingredients ri ON (recipe.id = ri.recipe_id) WHERE ri.ingredient_id = 1;
Все рецепты, содержащие по крайней мере один из нескольких ингредиентов:
SELECT DISTINCT recipe.name FROM recipe INNER JOIN recipe_ingredients ri ON (recipe.id = ri.recipe_id) WHERE ri.ingredient_id IN (1, 2, 5);
Или, если вы хотите найти по имени ингредиента:
SELECT recipe.name FROM recipe INNER JOIN recipe_ingredients ri ON (recipe.id = ri.recipe_id) INNER JOIN ingredients i ON (ri.ingredient_id = i.id) WHERE i.name = 'egg';
Первый из этих запросов немного быстрее, так как есть меньше объединений, и быстрее искать целочисленный ключ, чем строку. Тем не менее, с объемами данных, которые вы, вероятно, имеете в виду здесь, вероятно, не будет иметь большого значения. Вещь, которую следует помнить с помощью объединений, заключается в том, что, пока ваш дизайн таблицы прост, просто присоедините «соответствующие» элементы (например, первичный ключ с внешним ключом), а затем SELECT
столбцы SELECT
до того, что вам нужно.
Я сделал живую демоверсию .