Необработанное исключение PDOException: ошибка нарушения ограничения целостности - PullRequest
0 голосов
/ 12 апреля 2019

У меня ошибка

Неустранимая ошибка: необработанное исключение 'PDOException' с сообщением 'SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: внешний ключограничение не выполнено (gymdatabase. nutrition, CONSTRAINT nutrition_ibfk_2 ИНОСТРАННЫЙ КЛЮЧ (food_id)htdocs \ app \ models \ Nutrition_model.php: 11 Трассировка стека: # 0 G: \ 5-й семестр \ Ecommerce \ xampp \ htdocs \ app \ models \ Nutrition_model.php (11): PDOStatement-> execute (Array) # 1 G:\ 5-й семестр \ Ecommerce \ xampp \ htdocs \ app \ controllers \ Nutrition.php (59): Nutrition_model-> insert () # 2 [внутренняя функция]: Nutrition-> create () # 3 G: \ 5-й семестр \ Ecommerce \xampp \ htdocs \ app \ core \ App.php (38): call_user_func_array (Array, Array) # 4 G: \ 5-й семестр \ Ecommerce \ xampp \ htdocs \ index.php (5): App -> __ construct () # 5{main} брошено в G: \ 5-й семестр \ Ecommerce \ xampp \ htdocs \ app \ models \ Nutrition_model.php в строке 11

Так что есть 2таблицы в моей базе данных.В таблице продуктов есть столбцы food_id, имя, описание, путь.В таблице питания есть столбцы nutrition_id, user_id, food_id.Итак, в таблице питания есть внешний ключ food_id, и у меня пока нет данных в обеих таблицах.Я неоднократно сталкивался с этой ошибкой, но в основном потому, что мой внешний ключ был ограничен для удаления или в таблице уже есть данные, которые нарушают ограничения, но это не так.

public function insert()//for event
    {
        $stmt = $this->_connection->prepare("INSERT INTO nutrition(user_id, food_id) VALUES(:user_id, :food_id)");
        $stmt->execute(['user_id'=>$this->user_id,'food_id'=>$this->food_id]);
        return $stmt->rowCount();
    }

public function create()
    {

        if(isset($_POST['nutrition_action']))
        {       

            $nutrition = $this->model('Nutrition_model');
            $user_id = $_SESSION['user_id'];
            $nutrition->user_id = $user_id;

            $gender = $_POST['gender'];
            $type = $_POST['type'];     
            $cheating = $_POST['cheating'];


            if($cheating == "Hell Yes")//CH
            {
                $food = 1;

            }
            else if($gender == "Male")
            {
                if($type == "Lose Weight") //ML
                {
                    $food = 4;

                }
                else if($type == "Maintain Weight") //MM
                {
                    $food = 7;
                }
                else//MG
                {
                    $food = 10;
                }
            }
            else
            {
                if($type == "Lose Weight")
                {
                    $food = 0;
                }
                else if($type == "Maintain Weight")
                {
                    $food = 0;
                }
                else
                {
                    $food = 0;
                }
            }
            $nutrition->food_id = $food;
            $nutrition->insert();

            //header('location:/Nutrition/automatic_index');//send somewhere
        }
        else
        {
            $this->view('nutrition/nutrition_create');
        }


    }

1 Ответ

1 голос
/ 12 апреля 2019

Для ограничения внешнего ключа требуется запись во внешней таблице для INSERT.

Запись не может быть удалена, если на нее все еще ссылаются из другой таблицы и имеет ограничение FK.

При ON DELETE CASCADE, если вы удалите запись о еде, все питательные вещества с этим food_id также будут удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...