食谱书 - PHP混乱JOINING 3表,没有显示预期的内容

时间:2016-11-21 11:10:24

标签: php mysql join

我正在做一本食谱书。我的数据库表如下所示:

  • 表“食谱”包含列:id,name
  • 表“成分”包含列:id,name,measurement_id
  • 表“recipes_have_ingredients”包含列:id,recipe_id,ingredient_id,ingredient_amount,unit_id
  • 表“单位”包含列:id,name,measurement_id

这个想法是,用户将能够为配方插入一种配料,选择它的测量方式(体积,质量,长度......),然后,它将显示该测量的单位列表;例如,如果我插入鸡肉,并选择它作为“质量”,下次引入配料鸡时,它将显示用于测量质量的单位列表。

无论如何......此刻,我正在尝试显示一个包含食谱名称和成分列表的表格,其中包含成分名称,数量和单位名称。

如果我在mysql中执行查询

SELECT recipes_have_ingredients.recipe_id
     , ingredients.name
     , recipes_have_ingredients.ingredient_amount
     , units.name 
  FROM recipes_have_ingredients 
  JOIN ingredients 
    ON recipes_have_ingredients.ingredient_id = ingredients.id 
  JOIN units 
    ON recipes_have_ingredients.unit_id = units.id 
 WHERE recipe_id = 2

显示:

+-----------+-------+-------------------+----------+
| recipe_id | name  | ingredient_amount | name     |
+-----------+-------+-------------------+----------+
|         2 | onion |                 1 | kilogram |
|         2 | milk  |                30 | litre    |
+-----------+-------+-------------------+----------+

这就是我想要的,但是,如果我尝试创建它的功能:

public function display_ingredients_for_recipe($recipe_id = ':recipe_id') {
    include 'includes/db_connection.php';   
    try {

        $sql = "SELECT recipes_have_ingredients.recipe_id, ingredients.name, recipes_have_ingredients.ingredient_amount, units.name FROM recipes_have_ingredients JOIN ingredients ON recipes_have_ingredients.ingredient_id=ingredients.id JOIN units ON recipes_have_ingredients.unit_id=units.id WHERE recipe_id=:recipe_id";

          $results = $conn->prepare($sql);
          $results->bindParam(':recipe_id', $recipe_id, PDO::PARAM_INT);
          $results->execute();
         } catch(PDOException $e) {
            echo 'Error: ' . $e->getMessage() . '<br />';
            return array();
        }
          return $results->fetchAll(PDO::FETCH_ASSOC);
        }

我尝试使用它(recipe ['id'])来自display_recipes方法:

public function display_recipes() {
    include 'includes/db_connection.php';
    try {

        $sql = "SELECT id, name FROM recipes";

        $results = $conn->prepare($sql);
        $results->execute();
    } catch (PDOException $e) {
        echo 'Error: ' . $e->getMessage() . '<br />';
        return array();
    }
    return $results->fetchAll(PDO::FETCH_ASSOC);
}

 $ingredients = $recipeObj->display_ingredients_for_recipe($recipe['id']);
 echo '<pre>';
 print_r($ingredients);
 echo '</pre>'; die();

显示:

Array
(
    [0] => Array
        (
            [recipe_id] => 1
            [name] => gram
            [ingredient_amount] => 350
        )

)

我不知道我做错了什么....为什么如果我在mysql上查询它选择我想要的东西然后,如果我尝试调试成分我不能制作成分名称和要出现的单位名称。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

因为你有两个具有相同名称的字段(具有讽刺意味的是,恰好是&#34;名称&#34;)。 PHP在数组中不能有两个相同的键,因此它们会被覆盖。如果重命名一个(或两个)字段,它应该可以工作。

SELECT recipes_have_ingredients.recipe_id, ingredients.name AS ingredient_name, recipes_have_ingredients.ingredient_amount, units.name AS unit_name ...