你好,提前,谢谢你的时间。
我已经设置了食谱数据库: Recipe Database ER Diagram。 由4张桌子组成;
recipes (recipe_id, recipe_name, recipe_description, recipe_time)
ingredients (ingredient_id, ingredient_name)
recipe_ingredients (recipe_id, ingredient_id, amount)
instructions (recipe_id, steps, step_description)
我想通过一个网站,让我的用户将食谱添加到食谱表,其中包含成分表的成分。因此,以前未添加到数据库中的新成分将被添加,而已添加的成分将不会成为(这应该已经不是问题)。
我遇到的问题是在 recipe_ingredients 表中将这些成分(以及新的和旧的说明)链接到我的用户添加的配方。
到目前为止我的代码是(html):
<form action="insert.php" method="post">
<p>
<label for="RecipeName">Recipe Name</label>
<input type="text" name="recipename" id="recipeName">
</p>
<p>
<label for="IngredientName">Ingredient Name</label>
<input type="text" name="ingredientname" id="ingredientName">
</p>
<input type="submit" value="Add Records">
我的php:
$sql = "INSERT INTO ingredients (ingredient_name) VALUES ('$ingredient_name');";
$sql .= "INSERT INTO recipes (recipe_name) VALUES ('$recipe_name')";
if ($link->multi_query($sql) === TRUE) {
echo "New records created successfully";}
else {
echo "Error: " . $sql . "<br>" . $link->error;
}
请问任何问题,我欢迎任何帮助。
答案 0 :(得分:2)
我不知道我是否理解了您的所有问题,也不知道SO是否是解决问题的最佳位置,但我希望这些提示可以帮助您找到解决方案:
配方添加new Recipe
:
首先,添加配方(新的或修改的)
其次,将成分依次添加到新配方中。
详细说明:
首先,根据提供的模型,在表单中添加amount
字段:
<form action="insert.php" method="post">
<p>
<label for="RecipeName">Recipe Name</label>
<input type="text" name="recipename" id="recipeName">
</p>
<p>
<label for="IngredientName">Ingredient Name</label>
<input type="text" name="ingredientname" id="ingredientName">
</p>
<p>
<label for="amountOf">Amount</label>
<input type="number" min="0" max="99" name="amount" id="amountOf">
</p>
<input type="submit" value="Add Records">
提交后,您需要第一部分来查找名称的重复食谱,并定义它是新食谱还是现有食谱。像SELECT FROM recipes WHERE recipe_name LIKE '%$recipename%'
这样的查询可以解决这个问题(我考虑到您的食谱名称是唯一的。最好的方法是在表单上获取食谱ID,而不是名称)。
现在,如果它是一个新配方,你可以这样做(假设你正在使用Mysqli):
$sql = "INSERT INTO recipes (recipe_name) VALUES ('$recipe_name');"
$sql. = "INSERT INTO ingredients (ingredient_name) VALUES
('$ingredient_name')";
if ($link->multi_query($sql) === TRUE) {
$recipeId = $link->insert_id;
$link->next_result();
$ingredientId = $link->insert_id;
$sql2 = "INSERT INTO recipe_ingredients(recipe_id,ingredient_id,amount) VALUES ($recipeId,$ingredientId,$amount);"
if ($link->query($sql2) == TRUE){
echo "New records created successfully";}
}
else {
echo "Error: " . $sql2 . "<br>" . $link->error;
}
}
else {
echo "Error: " . $sql . "<br>" . $link->error;
}
如果食谱不是新的,您可以尝试:
$sql = "INSERT INTO ingredients (ingredient_name) VALUES
('$ingredient_name')";
if ($link->query($sql) === TRUE) {
//retrive your $recipeId from the SELECT query
$ingredientId = $link->insert_id;
$sql2 = "INSERT INTO recipe_ingredients(recipe_id,ingredient_id,amount) VALUES ($recipeId,$ingredientId,$amount);"
if ($link->query($sql2) == TRUE){
echo "New records created successfully";}
}
else {
echo "Error: " . $sql2 . "<br>" . $link->error;
}
else {
echo "Error: " . $sql . "<br>" . $link->error;
}
这些代码只是示例,您需要处理可能的errors和exceptions。查看try/catch/finally块来处理异常。
Here is一个关于使用mysqli->next_result()
来帮助您处理需要检索的不同ID的问题。
<强>更新强>
正如您的评论中所述并遵循您的模型,要将各种成分插入同一配方中,您需要将表单分成两种不同的形式,一种用于插入配方,另一种用于插入特定配方(食谱和预先存在的食谱。
然后,重复查询:
INSERT INTO ingredients (ingredient_name) VALUES ('$ingredient_name')
和
INSERT INTO recipe_ingredients(recipe_id, ingredient_id, amount)
VALUES ($recipeId, $ingredientId, $amount)
插入每种成分。
如果可以的话,只是一个建议。显然,您在理解模型及其在真实关系数据库中的工作原理时遇到了一些麻烦。
也许关于这个主题的一些教程对你来说是件好事。
尝试一下:
我对这些教程一无所知(现在只是google),但这对于更好地了解数据库的工作原理以及每个任务需要的查询是一个良好的开端。