Вставить NULL во внешний ключ, когда поле POST пусто

У меня есть таблица с именем внешнего ключа parent_id. я пытался вставить данные вот так:

 $parent = $_POST['parent_id'] ?? null;

        $data = [
            'name' => $_POST['name'],
            'skill_category_id' => $_POST['skill_category_id'],
            'parent_id' => $parent,
        ];

а в SQL я использую такой код:

public static function update(array $data): bool
    {
        $sql = 'UPDATE skill_types SET skill_category_id=:skill_category_id, parent_id=:parent_id, name=:name WHERE id=:id';

        $db = static::getDB();
        $stmt = $db->prepare($sql);

        $stmt->bindValue(':skill_category_id', $data['skill_category_id'], PDO::PARAM_INT);
        $stmt->bindValue(':parent_id', $data['parent_id']);
        $stmt->bindValue(':name', $data['name']);
        $stmt->bindValue(':id', $data['id'], PDO::PARAM_INT);

        return $stmt->execute();
    }

Я уже установил в своей таблице значение null, но это все равно вызывало ошибку:

General error: 1366 Incorrect integer value: '' for column 'parent_id' at row 1'

как я могу это исправить?

$parent = $_POST['parent_id'] ?? null; - вполне возможно, что $parent будет null, но сообщение об ошибке указывает, что столбец ожидает целое число. Я считаю, что вам нужно преобразовать его в целое число и / или установить тип данных; PDO::PARAM_INT
waterloomatt 30.05.2018 21:10

вам нужно установить значение 0, а не null, потому что настройка - это int.

Jonny 30.05.2018 21:13

если я конвертирую в целое число, это дает мне ошибку SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (perwita.skill_types, ОГРАНИЧЕНИЕ skill_types_parent_id_foreign FOREIGN KEY (parent_id) ССЫЛКИ skill_types (id) ON ОБНОВЛЕНИЕ КАСКАДА) '

Ying 30.05.2018 21:14

Вот почему мне нужно установить его в ноль. не 0

Ying 30.05.2018 21:15
$parent = empty($_POST['parent_id']) ? null : $_POST['parent_id'];
Johnny Mopp 30.05.2018 21:15

@JohnnyMopp это работает, спасибо. Вы можете поставить его на ответ, если хотите, чтобы я мог выбрать его как правильный ответ.

Ying 30.05.2018 21:17

Я предлагаю изменить заголовок на «Вставить NULL, когда поле POST пусто». Это может помочь другим пользователям с той же проблемой найти этот вопрос.

Paul Spiegel 30.05.2018 21:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
7
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в $parent = $_POST['parent_id'] ?? null;. Если ваша страница настроена правильно, $_POST['parent_id'] никогда не будет null, но может быть пустым (''). Таким образом, нулевой оператор объединения ?? назначит $parent = ''. И это недопустимое значение для int.

Вы можете проверить, пусто ли значение:

$parent = empty($_POST['parent_id']) ? null : $_POST['parent_id'];

Другие вопросы по теме