无法添加或更新子行:外键约束失败

时间:2015-11-02 01:04:14

标签: php mysql foreign-keys constraints

我试图 INSERT notice_title notice_content 进入通知表和< em> category_type 进入类别表,但我在下面收到以下错误,无法解决。

  

致命错误:未捕获的异常&#39; PDOException&#39;消息&#39; SQLSTATE [23000]:完整性约束违规:1048列&#39; category_type&#39;不能为空&#39;在C:\ xampp \ htdocs \ add_notice.php:17堆栈跟踪:#0 C:\ xampp \ htdocs \ add_notice.php(17):PDOStatement-&gt;执行()#1 {main}抛出C:\ xampp第17行\ htdocs \ add_notice.php

的MySQL

_config.scss

add_notice.php

CREATE TABLE `categories`
(
     `category_id` INT(3) NOT NULL AUTO_INCREMENT, 
     `category_type` VARCHAR(255) NOT NULL, 
      PRIMARY KEY (`category_id`)
)     ENGINE = InnoDB;

CREATE TABLE `notices`
(
     `notice_id` INT(3) NOT NULL AUTO_INCREMENT, 
     `notice_category_id` INT(3) NOT NULL, 
     `notice_user_id` INT(3) NOT NULL, 
     `notice_title` VARCHAR(255) NOT NULL, 
     `notice_content` VARCHAR(500) NOT NULL, 
     `notice_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
      PRIMARY KEY (`notice_id`), 
      FOREIGN KEY (`notice_category_id`)
           REFERENCES categories(`category_id`), 
      FOREIGN KEY (`notice_user_id`)
           REFERENCES users(`user_id`)
)     ENGINE = InnoDB;

由于

2 个答案:

答案 0 :(得分:1)

首先,这是name="add_notice"。除非与jQuery一起使用,否则表单不包含name属性,我在这里看不到jQuery。

另外,这里发生的事情是那些2个POST阵列很可能是空的,正如@Drew在下面给出的答案中发布的那样。 “插入在表单显示之前用空格”

您需要对所有POST阵列使用!empty()。要么这样做,要么删除约束并使用默认值。

使用错误报告。

参考文献:

另外,你在这里也错过了一个绑定。初始查询中有4个,但在准备查询后只有3个绑定发生。

$query2 = "INSERT INTO notices (notice_id, notice_title, notice_content, notice_category_id) VALUES (:notice_id, :notice_title, :notice_content, :notice_category_id)";
$query2 = $connection->prepare($query2);
$query2->bindParam(":notice_id", $_POST["notice_id"]);
$query2->bindParam(":notice_title", $_POST["notice_title"]);
$query2->bindParam(":notice_content", $_POST["notice_content"]);
$query2->execute();

由于notice_id是人工智能,因此您需要将其从查询中删除,并添加:notice_category_id的查询,此处缺少。

notice_titlenotice_content为空的主要原因是:

您需要为以下内容添加值并修复“隐藏”缺少“类型”的语法错误:

<input name="notice_id" hidden />
<input name="category_id" hidden />

应该是这样的:

<input name="notice_id" type="hidden" value="example_value_x" />
<input name="category_id" type="hidden" value="example_value_y" />

Nota: value="example_value_x"value="example_value_y"是代表值。您将需要填写其中各自的值。

至于哪一个用于:notice_category_id绑定,是未知的。您将需要填写其中各自的值。

  • 我相信我已经足够让你的代码工作了。现在由你来决定填补一些空白。

答案 1 :(得分:0)

我认为你应该插入categories第一个插入notices

当您插入通知时,它没有引用的类别,因此约束有效。