如何通过表单添加多对多关系?

时间:2015-05-26 12:51:37

标签: php mysql

我的数据库包含以下数据:

fish
---
id
name
cooking_type_id
---

cooking_type
---
id
name
---

cooking_type_relationships
---
fish_id
cooking_type_id
---

我正在尝试创建一个向数据库添加鱼的表单。一切正常,但添加许多关系时遇到问题。通过表格,我已经制作了一个包含所有烹饪类型的复选框列表,用户点击了所有适合鱼类的烹饪类型。但是我如何查询数据库以便很好地创建关系呢?

以下是创建复选框列表的代码:

include 'conn.php';
    echo "<ul class='cooking-list'>";
    $query = "SELECT * FROM cooking_type c"; 
    $result = $mysqli->query($query);
    mysqli_query($mysqli, "SET NAMES 'utf8'");
    while($row = mysqli_fetch_array($result))
    {            
    // run through the results from the database, generating the checkboxes 
    echo "\n\t<li>"; 
    echo "<input id='".$row['name']."' type='checkbox' name'type_id'><p>{$row['name']}</p>"; 
    echo "</li>";
    echo "<br><br>";
    } 
    echo "</ul>"; 
    mysqli_close($mysqli);

编辑:我没有让查询正常工作。我此时有点困惑。这是我试图发布的查询:

include 'conn.php';
mysqli_query($mysqli, "SET NAMES 'utf8'");
$query = "INSERT INTO fish (name, image, about, season_id)
      VALUES ('$_POST[name]', '$_POST[image]', '$_POST[about]', '$_POST[season_id]');
      INSERT INTO cooking_type_relationships (fish_id, cooking_type_id)
      VALUES (mysqli_insert_id, cooking_type_id);"


$mysqli->query($query);

mysqli_close($mysqli);

2 个答案:

答案 0 :(得分:1)

为此,您需要将数据插入两个表,fish表和cooking_types_relationships表。

伪代码:

insert into fish values (a, b, c);
insert into cooking_types_relationships values (mysqli_insert_id, cooking_type_id);

这里的诀窍是使用mysqli_insert_id

答案 1 :(得分:1)

您无法在一个查询中发出2个请求。这是由于安全问题。 从$ _POST获取值时,请始终引用您的密钥 我假设你的mysql表中你的id列有primary和auto_increment标志。

然后尝试执行以下操作:

include 'conn.php';
mysqli_query($mysqli, "SET NAMES 'utf8'");

$query = "INSERT INTO fish (name, image, about, season_id)
  VALUES ('$_POST['name']', '$_POST['image']', '$_POST['about']', '$_POST['season_id']')";

mysqli_query($mysqli, $query);
$id = mysqli_insert_id($mysqli);

$query = "INSERT INTO cooking_type_relationships (fish_id, cooking_type_id)
  VALUES (". $id . ", ".$cooking_type_id.")";
mysqli_query($mysqli, $query);

mysqli_close($mysqli);

您必须以与fish id类似的方式找到正确的$ cooking_type_id。或者你可能已经知道它是否是固定的烹饪类型列表

您还混淆了程序和面向对象的查询方式。 $ mysqli-&gt; query()是面向对象的,我认为这不是你需要的。

请记住在生产中使用它之前过滤$ _POST值。正如其他提到的那样看PDO准备好的陈述

如果您想再次获取数据,可以像这样进行内连接:

SELECT * FROM fish 
INNER JOIN cooking_type_relationships ON fish.id=fish_id
INNER JOIN cooking_type ON cooking_type_id=cooking_type.id

如果鱼没有任何烹饪类型,但您仍然希望它显示为结果,您只需将内部连接更改为LEFT JOIN