提前打个招呼,谢谢你的时间。
我已经建立了一个配方数据库:
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)
我想,通过一个网站,让我的用户添加食谱到食谱表与配料表的成分。这样,以前没有添加到数据库中的新成分将被添加,那些已经添加的成分将不会被添加(这应该已经不是问题)。
我遇到的问题是将这些新的和旧的配料(以及相关说明)链接到我的用户正在添加的配料表中的配料。
到目前为止,我的代码是(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;
}

请问任何问题,我欢迎任何我能得到的帮助。

最佳答案

我不知道我是否理解你的所有问题,也不知道这是否是解决问题的最佳方法,但我希望以下一些建议能帮助你找到解决方法:
添加anew 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;
}

这些代码只是示例,您需要处理可能的errorsexceptions。查看try/catch/finally块来处理异常。
Here is一个关于使用mysqli->next_result()帮助您使用需要检索的不同id的SO问题。
更新
正如你的评论和跟随你的模型,把不同的成分插入到相同的配方中,你需要把你的表格分成两种不同的形式,一种是插入菜谱,另一种是在特定的(预先存在的)配方中插入配料。
然后,重复查询:
INSERT INTO ingredients (ingredient_name) VALUES ('$ingredient_name')


INSERT INTO recipe_ingredients(recipe_id, ingredient_id, amount)
                       VALUES ($recipeId, $ingredientId, $amount)

每种成分的含量。
如果可以的话,只是个建议。显然,您在理解您的模型以及它如何在真正的关系数据库中工作时遇到了一些困难。
也许一些关于这个主题的教程对你来说是件好事。
试试看:
ER Model to Relational Model
Converting E-R Models to Relational Models
ER DIAGRAM TO RELATIONAL SCHEMA MAPPING
我不知道这些教程(只是谷歌它现在),但这将是一个很好的开始,更好地了解你的数据库如何工作,以及你需要什么查询每项任务。

关于php - 配方数据库-使用现有或其他成分添加配方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32991704/

10-12 05:35