我目前正在制作一个插页,让我可以将数据添加到我的数据库中。但是我最近遇到了一个问题。 我的插入表单包含一个选项,显示链接表中的数据,我想将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"/>
<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'不能为空
那么我需要做些什么来实现这个目标呢?
答案 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