Вот схема моей БД:
И у меня есть это сообщение об ошибке, когда я пытаюсь удалить изображение:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`test`.`scores`, CONSTRAINT `scores_ibfk_2` FOREIGN KEY (`picture_id`) REFERENCES `pictures` (`id`)) in /Applications/MAMP/htdocs/legogram/app/model/model.php:173
Когда мое изображение не нравится, я могу удалить его, но когда оно нравится, я не могу
Вот функция для вывода списка моих изображений:
public function listPictures_session()
{
$this->open();
$stmt = $this->pdo->prepare("SELECT pictures.id, pictures.owner_id, pictures.title, pictures.description, pictures.path,
SUM(scores.score)/COUNT(scores.id) AS 'score'
FROM pictures LEFT OUTER JOIN scores ON pictures.id=scores.picture_id
GROUP BY pictures.id
ORDER BY pictures.id DESC LIMIT 100");
$stmt->execute();
return $stmt->fetchAll();
}
И как я это называю на мой взгляд:
$pictures = $this->model->listPictures_session();
foreach ($pictures as $picture) {
if ($picture["owner_id"] == $_SESSION["id"]) {
echo picture["id"] }"
Но я не выбираю scores.id при выборе моей функции listPictures_session. Поэтому я попытался добавить SELECT scores.id, чтобы сначала удалить его. Но когда я пытаюсь добавить scores.id к SELECT, у меня возникает ошибка GROUP BY.
Я добавлял scores.id таким образом, но это не сработало:
SELECT pictures.id, pictures.owner_id, pictures.title, pictures.description, pictures.path,
SUM(scores.score)/COUNT(scores.id) AS 'score', scores.id
И функция для его удаления:
public function deletepicture($user)
{
$this->open();
$stmt = $this->pdo->prepare("DELETE FROM pictures WHERE id=:id");
return $stmt->execute(array(":id" => $user["id"]));
}
Как я могу решить эту проблему, чтобы я мог удалить свое изображение? Большое спасибо и хорошего дня
Также имейте в виду, что мы ничего не можем увидеть о вашей схеме, и вы также не предоставили образцы данных, поэтому мы работаем вслепую. Попробуйте отредактировать свой вопрос. См. также Как спросить и как создать минимальный воспроизводимый пример вашей задачи.
Ваша таблица scores, похоже, имеет ограничение внешнего ключа для таблицы pictures. Если вы хотите удалить изображения, вам сначала нужно удалить все ссылки на эти изображения в других таблицах.
Я имею в виду функцию "listpictures_session" GROUP BY. Я попытался добавить «scores.id» в выбор, но когда я это делаю, у меня возникает ошибка, связанная с GROUP BY
В порядке. Но из вашего поста кажется, что речь идет об удалении, а не о выборе? Вам нужно будет редактировать задать вопрос, чтобы правильно уточнить, что вы пытаетесь сделать с этим выбором, и как это связано с вашим вопросом об удалении.






внешний ключ таблицы (`test`.`scores`) ссылка на таблицу pictures
вы должны удалить записи (`test`.`scores`) ссылки на pictures перед удалением записи pictures
Я не думаю, что ваша ошибка GROUP BY имеет отношение к вашей реальной проблеме.
По сути, если у вас есть строки в scores, которые относятся к определенному идентификатору изображения, вы должны удалить все строки из scores, которые содержат этот идентификатор изображения, прежде чем вы сможете удалить связанную строку в pictures.
например
DELETE FROM scores WHERE picture_id = :id
DELETE FROM pictures WHERE id = :id
Хорошо, я понимаю, поэтому я делаю первую функцию для удаления оценок, а вторую — для удаления изображения? На мой взгляд, я выполнял этот цикл: "$pictures = $this->model->listPictures_session(); foreach ($pictures as $picture) { if ($picture["owner_id"] == $_SESSION["id" ]) { echo picture["id"] }" Но когда я попытался добавить "scores.id" в функцию listPictures_session(), у меня возникла ошибка GROUP BY
Да, я действительно не понимаю, почему вам нужно что-то делать в своем цикле, чтобы получить идентификатор счета. Вам не нужно знать какой-либо конкретный идентификатор оценки — вы можете просто удалить все оценки, которые имеют соответствующий идентификатор изображения, как я показал.
Насколько я понимаю, на самом деле вы хотите удалить строку из таблицы pictures. У вас есть ограничение внешнего ключа в scores на scores.picture_id, которое ссылается на pictures.id. Это хорошие вещи.
Ваше сообщение об ошибке выглядит следующим образом:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`test`.`scores`, CONSTRAINT `scores_ibfk_2` FOREIGN KEY (`picture_id`) REFERENCES `pictures` (`id`)) in /Applications/MAMP/htdocs/legogram/app/model/model.php:173
что означает, что это ограничение внешнего ключа нарушается при попытке удалить строку в таблице pictures. Это вызвано тем, что одна или несколько строк в таблице scores содержат picture_id ссылку на pictures.id. Вы не можете удалить строку в pictures, не удалив все ссылки на нее. Вы можете либо установить ссылку на null, если столбец ссылок позволяет null, либо вы можете полностью удалить строку. Насколько я могу судить, эта таблица используется для хранения пользовательских рейтингов изображений других пользователей, и строки в этой таблице не имеют смысла без идентификатора изображения, на который он ссылается, поэтому ваш лучший подход здесь, вероятно, состоит в том, чтобы удалить оскорбительные строки. вообще. Вы можете сделать это как часть процесса удаления:
public function deletepicture($user) {
$this->open();
$stmt = $this->pdo->prepare(
<<<SQL
DELETE FROM
scores
WHERE
picture_id = :pictureId
SQL
);
$stmt->execute([
":pictureId" => $user["id"]
]);
$stmt = $this->pdo->prepare(
<<<SQL
DELETE FROM
pictures
WHERE
id = :id
SQL
);
return $stmt->execute([
":id" => $user["id"]
]);
}
I still get a mysql error because of the GROUP BY...что ты имеешь в виду? Вы не можете группировать в DELETE. Вам нужно удалить фактические строки, а не агрегированные вычисления. Покажите нам конкретно, какой запрос DELETE вы пытались выполнить, чтобы удалить лайки.