Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено

Я пытаюсь ВСТАВИТЬ notice_title а также notice_content в таблица уведомлений и category_type в таблица категорий но я получаю следующую ошибку ниже и не могу решить ее.

Неустранимая ошибка: необработанное исключение «PDOException» с сообщением «SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец« тип_категории »не может быть пустым» в C: \ xampp \ htdocs \ add_notice.php: 17 Трассировка стека: # 0 C: \ xampp \ htdocs \ add_notice.php (17): PDOStatement-> execute () # 1 {main}, брошенный в C: \ xampp \ htdocs \ add_notice.php в строке 17

MySQL

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;

add_notice.php

<?php
session_start();

include_once("database/connect.php");

if(isset($_POST['add_notice'])) {
$notice_id      = $_POST['notice_id'];
$notice_title   = $_POST['notice_title'];
$notice_content= $_POST['notice_content'];
$category_id    = $_POST['category_id'];
$category_type  = $_POST['category_type'];
}

$query1 = "INSERT INTO categories (category_id, category_type) VALUES (:category_id, :category_type)";
$query1 = $connection->prepare($query1);
$query1->bindParam(":category_id", $_POST["category_id"]);
$query1->bindParam(":category_type", $_POST["category_type"]);
$query1->execute();

$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();
?>

<!DOCTYPE html>
<html lang="en">
<head>
<title>Create a Notice</title>
</head>
<body>
<h4>Create a Notice</h4>
<form method="post" name="add_notice" action="add_notice.php">
<input name="notice_id" hidden />
<input name="category_id" hidden />

<input type="text" name="notice_title" />
<br />
<textarea name="notice_content" /></textarea>
<br /><br />
<label>Category:</label>
<select name="category_type">
<option value="">Select...</option>
<option value="Content1">Content1</option>
<option value="Content2">Content2</option>
<option value="Content3">Content3</option>
</select>
<br />
<button type="submit" name="submit">Create a Notice</button>
</form>
</body>

Спасибо

-1

Решение

Во-первых, это name="add_notice", Формы не содержат атрибут name, если не используются с jQuery, и я не вижу здесь jQuery.

Кроме того, здесь происходит то, что эти 2 POST-массива, скорее всего, пусты, так же, как @Drew опубликовал ответ, приведенный ниже. «вставки выполняются с пробелами перед показом формы».

Вам нужно использовать !empty() против всех ваших массивов POST. Либо сделайте это, либо удалите ограничения и используйте значение по умолчанию.

Используйте отчеты об ошибках.

Рекомендации:

Кроме того, вы также здесь не хватает привязки. У вас есть 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 это AI, вам нужно удалить его из вашего запроса и добавить один для :notice_category_id чего здесь не хватает

Основная причина, почему notice_title а также notice_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

Другие решения

Я думаю ты должен вставить categories вставка первого берора notices,

Когда вы вставляете уведомление, нет никакой категории, на которую оно ссылается, поэтому ограничение работает.

0