craftcms / cms

Build bespoke content experiences with Craft.
https://craftcms.com
Other
3.22k stars 626 forks source link

[3.5.x-dev] Save Element form w/ uploaded file: Integrity constraint violation #6396

Open timkelty opened 4 years ago

timkelty commented 4 years ago

I have a frontend entries/save-entry with a file input for an assets field.

Looks like some params aren't getting set in the query, causing a constraint violation. Same form worked in 3.4.

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (craftcms_local.relations, CONSTRAINT relations_targetId_fk FOREIGN KEY (targetId) REFERENCES elements (id) ON DELETE CASCADE) The SQL being executed was: INSERT INTO relations (fieldId, sourceId, sourceSiteId, targetId, sortOrder, dateCreated, dateUpdated, uid) VALUES (258, 142919, NULL, 0, 1, '2020-07-16 12:52:40', '2020-07-16 12:52:40', 'abec2f08-b3d3-4f51-aa92-971240ebe0fd')

Additional info

brandonkelly commented 4 years ago

Please look for that error in storage/logs/web.log and post the stack trace.

timkelty commented 4 years ago

My bad, thought I had:

2020-07-16 15:40:38 [-][2][68ce025dbec88623fb8f7d2465532a7a][error][yii\db\IntegrityException] PDOException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`craftcms_local`.`relations`, CONSTRAINT `relations_targetId_fk` FOREIGN KEY (`targetId`) REFERENCES `elements` (`id`) ON DELETE CASCADE) in /app/vendor/composer/yiisoft/yii2/db/Command.php:1293
Stack trace:
#0 /app/vendor/composer/yiisoft/yii2/db/Command.php(1293): PDOStatement->execute()
#1 /app/vendor/composer/yiisoft/yii2/db/Command.php(1093): yii\db\Command->internalExecute('INSERT INTO `re...')
#2 /app/vendor/composer/craftcms/cms/src/helpers/Db.php(734): yii\db\Command->execute()
#3 /app/vendor/composer/craftcms/cms/src/services/Relations.php(107): craft\helpers\Db::batchInsert('{{%relations}}', Array, Array)
#4 /app/vendor/composer/craftcms/cms/src/fields/BaseRelationField.php(747): craft\services\Relations->saveRelations(Object(craft\fields\Assets), Object(craft\elements\Entry), Array)
#5 /app/vendor/composer/craftcms/cms/src/fields/Assets.php(543): craft\fields\BaseRelationField->afterElementSave(Object(craft\elements\Entry), true)
#6 /app/vendor/composer/craftcms/cms/src/base/Element.php(3138): craft\fields\Assets->afterElementSave(Object(craft\elements\Entry), true)
#7 /app/vendor/composer/craftcms/cms/src/elements/Entry.php(1454): craft\base\Element->afterSave(true)
#8 /app/vendor/composer/craftcms/cms/src/services/Elements.php(2343): craft\elements\Entry->afterSave(true)
#9 /app/vendor/composer/craftcms/cms/src/services/Elements.php(690): craft\services\Elements->_saveElementInternal(Object(craft\elements\Entry), true, false, true)
#10 /app/vendor/composer/craftcms/cms/src/controllers/EntriesController.php(379): craft\services\Elements->saveElement(Object(craft\elements\Entry))
#11 [internal function]: craft\controllers\EntriesController->actionSaveEntry(false)
#12 /app/vendor/composer/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#13 /app/vendor/composer/yiisoft/yii2/base/Controller.php(180): yii\base\InlineAction->runWithParams(Array)
#14 /app/vendor/composer/craftcms/cms/src/web/Controller.php(199): yii\base\Controller->runAction('save-entry', Array)
#15 /app/vendor/composer/yiisoft/yii2/base/Module.php(528): craft\web\Controller->runAction('save-entry', Array)
#16 /app/vendor/composer/craftcms/cms/src/web/Application.php(289): yii\base\Module->runAction('entries/save-en...', Array)
#17 /app/vendor/composer/craftcms/cms/src/web/Application.php(558): craft\web\Application->runAction('entries/save-en...', Array)
#18 /app/vendor/composer/craftcms/cms/src/web/Application.php(268): craft\web\Application->_processActionRequest(Object(craft\web\Request))
#19 /app/vendor/composer/yiisoft/yii2/base/Application.php(386): craft\web\Application->handleRequest(Object(craft\web\Request))
#20 /app/public/index.php(5): yii\base\Application->run()
#21 {main}

Next yii\db\IntegrityException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`craftcms_local`.`relations`, CONSTRAINT `relations_targetId_fk` FOREIGN KEY (`targetId`) REFERENCES `elements` (`id`) ON DELETE CASCADE)
The SQL being executed was: INSERT INTO `relations` (`fieldId`, `sourceId`, `sourceSiteId`, `targetId`, `sortOrder`, `dateCreated`, `dateUpdated`, `uid`) VALUES (258, 142923, NULL, 0, 1, '2020-07-16 19:40:38', '2020-07-16 19:40:38', '77cd6753-8636-4014-8cc2-6e8e2b25051f') in /app/vendor/composer/yiisoft/yii2/db/Schema.php:677
Stack trace:
#0 /app/vendor/composer/yiisoft/yii2/db/Command.php(1298): yii\db\Schema->convertException(Object(PDOException), 'INSERT INTO `re...')
#1 /app/vendor/composer/yiisoft/yii2/db/Command.php(1093): yii\db\Command->internalExecute('INSERT INTO `re...')
#2 /app/vendor/composer/craftcms/cms/src/helpers/Db.php(734): yii\db\Command->execute()
#3 /app/vendor/composer/craftcms/cms/src/services/Relations.php(107): craft\helpers\Db::batchInsert('{{%relations}}', Array, Array)
#4 /app/vendor/composer/craftcms/cms/src/fields/BaseRelationField.php(747): craft\services\Relations->saveRelations(Object(craft\fields\Assets), Object(craft\elements\Entry), Array)
#5 /app/vendor/composer/craftcms/cms/src/fields/Assets.php(543): craft\fields\BaseRelationField->afterElementSave(Object(craft\elements\Entry), true)
#6 /app/vendor/composer/craftcms/cms/src/base/Element.php(3138): craft\fields\Assets->afterElementSave(Object(craft\elements\Entry), true)
#7 /app/vendor/composer/craftcms/cms/src/elements/Entry.php(1454): craft\base\Element->afterSave(true)
#8 /app/vendor/composer/craftcms/cms/src/services/Elements.php(2343): craft\elements\Entry->afterSave(true)
#9 /app/vendor/composer/craftcms/cms/src/services/Elements.php(690): craft\services\Elements->_saveElementInternal(Object(craft\elements\Entry), true, false, true)
#10 /app/vendor/composer/craftcms/cms/src/controllers/EntriesController.php(379): craft\services\Elements->saveElement(Object(craft\elements\Entry))
#11 [internal function]: craft\controllers\EntriesController->actionSaveEntry(false)
#12 /app/vendor/composer/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#13 /app/vendor/composer/yiisoft/yii2/base/Controller.php(180): yii\base\InlineAction->runWithParams(Array)
#14 /app/vendor/composer/craftcms/cms/src/web/Controller.php(199): yii\base\Controller->runAction('save-entry', Array)
#15 /app/vendor/composer/yiisoft/yii2/base/Module.php(528): craft\web\Controller->runAction('save-entry', Array)
#16 /app/vendor/composer/craftcms/cms/src/web/Application.php(289): yii\base\Module->runAction('entries/save-en...', Array)
#17 /app/vendor/composer/craftcms/cms/src/web/Application.php(558): craft\web\Application->runAction('entries/save-en...', Array)
#18 /app/vendor/composer/craftcms/cms/src/web/Application.php(268): craft\web\Application->_processActionRequest(Object(craft\web\Request))
#19 /app/vendor/composer/yiisoft/yii2/base/Application.php(386): craft\web\Application->handleRequest(Object(craft\web\Request))
#20 /app/public/index.php(5): yii\base\Application->run()
#21 {main}
Additional Information:
Array
(
    [0] => 23000
    [1] => 1452
    [2] => Cannot add or update a child row: a foreign key constraint fails (`craftcms_local`.`relations`, CONSTRAINT `relations_targetId_fk` FOREIGN KEY (`targetId`) REFERENCES `elements` (`id`) ON DELETE CASCADE)
)
brandonkelly commented 4 years ago

Are you able to run Xdebug on this machine? If so can you set a breakpoint in app/vendor/composer/craftcms/cms/src/services/Relations.php line 107, and see if you can tell what the foreign key constraint violation is likely to be? Kinda stumped.

timkelty commented 4 years ago

I can! coming right up…

timkelty commented 4 years ago

@brandonkelly $targetIds passed to saveRelations is an array, but not of IDs, it's the filename of the asset. Since the targetId is an Int, it gets inserted as 0, thus the violation.

timkelty commented 4 years ago

@brandonkelly Derp – realized my form didn't have enctype="multipart/form-data"… with it, all is well.

Though perhaps this case should be caught anyway?