通过表单选择选项插入mysql外键值

时间:2018-05-12 12:39:50

标签: php mysql mysql-workbench

我目前正在制作一个插页,让我可以将数据添加到我的数据库中。但是我最近遇到了一个问题。 我的插入表单包含一个选项,显示链接表中的数据,我想将id插入到另一个表中。

我的数据库示例:

---------------------------
| location_id | location  |
|-------------------------|
|      1      | Amsterdam |
|-------------------------|
|      2      | Hilversum |
|-------------------------|
|      3      | Loosdrecht|
|-------------------------|

-------------------------------------------------------------------------
| product_id | productname | productcode | amount | product_location_id |
|-----------------------------------------------------------------------|
|      1     |   Hammer    |    HK47     |   10   |          1          |
|-----------------------------------------------------------------------|
|      2     |    saw      |    ZW67     |   13   |          3          |
|-----------------------------------------------------------------------|

正如您所看到的,product_location_id是一个外键,它应该通过显示第一个表中的主键location_id来告诉哪个产品在哪个位置。

我曾经尝试过的代码:

Manager.php

    class Manager {

       protected $conn;

       function __construct($conn) {
          $this->conn = $conn;
       }

      function createProducts() {
         $statement = $this->conn->prepare("INSERT INTO supplies 
         (productname, productcode, amount, product_location_id) VALUES 
         (?,?,?,?)");

          $statement->bindValue(1, $_POST["productname"]);
          $statement->bindValue(2, $_POST["productcode"]);
          $statement->bindValue(3, $_POST["amount"]);
          $statement->bindValue(4, $_POST["product_location_id"]);

          $statement->execute();

       }

       function getLocations() {
          $statement = $this->conn->prepare("SELECT location_id, location FROM 
          location");

          $statement->execute();

          return $statement;
       }
    }

create.php

<?php
    require_once 'database.php';

    require ("../src/Classes/Manager.php");

    $productManager = new Manager($conn);

    $getLocatie = $productManager->getLocations();


    if($_SERVER["REQUEST_METHOD"] == "POST") {
        if(isset($_POST['create'])) {
            $addProduct = $productManager->createProducts();
            header("Location: read.php");
        }

        if(isset($_POST['cancel'])) {
            header("Location: read.php");
        }
    }
?>

<html>
    <head>
        <link rel="stylesheet" type="text/css" href="style.css">
        <meta charset="UTF-8">
        <title>Create</title>
    </head>
    <body>
        <form method="POST" class="formHandler">
            <label for="productname">Productname</label><br/>
            <input type="text" id="productname" name="productname" placeholder="productname"/><p/>

            <label for="productcode">Productcode</label><br/>
            <input type="text" id="productcode" name="productcode" placeholder="productcode"/><p/>

            <label for="aantal">Amount</label><br/>
            <input type="text" id="amount" name="amount" placeholder="amount"/><p/>

            <label for="location">Location</label><br/>
            <select id="location" name="location">
                <?php foreach ($getLocation->fetchAll() as $row) { ?>
                <option name="location" value="<?=$row["location_id"] ?>"><?=$row["location"] ?></option>
                <?php } ?>
            </select><p/>

            <input type="submit" name="create" value="Create"/>&nbsp;
            <input type="submit" name="cancel" value="Cancel"/>
        </form>
    </body>
</html>

我希望能够通过表单将这些id值从location_id插入到product_location_id中,但是当我尝试执行insert语句时,它会给我错误。

我收到的错误:

  

注意:第23行的D:\ wamp \ www \ crudmetlogin2 \ src \ Classes \ Manager.php中的未定义索引:product_location_id

     

致命错误:未捕获异常'PDOException',消息'SQLSTATE [23000]:完整性约束违规:1048列'product_location_id'不能为空'在D:\ wamp \ www \ crudmetlogin2 \ src \ Classes \ Manager.php on第25行

     

PDOException:SQLSTATE [23000]:完整性约束违规:1048第25行的D:\ wamp \ www \ crudmetlogin2 \ src \ Classes \ Manager.php中的列'product_location_id'不能为空

那么我需要做些什么来实现这个目标呢?

2 个答案:

答案 0 :(得分:1)

所有错误似乎都来自这行代码

  $statement->bindValue(4, $_POST["product_location_id"]);

似乎product_location_id不以html的形式存在, 我想product_location_id应该来到这里。

<select id="location" name="location">
                <?php foreach ($getLocation->fetchAll() as $row) { ?>
                <option name="location" value="<?=$row["location_id"] ?>"><?=$row["location"] ?></option>
                <?php } ?>
            </select><p/>

因此,请尝试更改此选项的名称

<select id="location" name="product_location_id">
                <?php foreach ($getLocation->fetchAll() as $row) { ?>
                <option name="location" value="<?=$row["location_id"] ?>"><?=$row["location"] ?></option>
                <?php } ?>
            </select><p/>

答案 1 :(得分:0)

您的表单有一个名为location

的下拉列表
<select id="location" name="location">

但是你的PHP脚本称之为product_location_id

$statement->bindValue(4, $_POST["product_location_id"]);

因此将代码更改为

$statement->bindValue(4, $_POST["location"]);
  

注意<option>标记没有name属性,因此请将其从此行中删除

<option name="location" value="<?=$row["location_id"] ?>"><?=$row["location"] ?></option>
//      ^^^^^^^^^^^^^^^ get rid of this