#php #html #jquery #mysql-workbench
#php #HTML #jquery #mysql-workbench
Вопрос:
Я столкнулся с проблемой, которую, похоже, не могу исправить… Я написал некоторый код на PHP и JavaScript, чтобы иметь возможность лайкать сообщения в моем веб-приложении. Это работает, НО для некоторых изображений, когда я пытаюсь понравиться или не понравиться изображению, оно нравится или не нравится дважды. Я не знаю, почему он это делает, но из-за этого я получаю ошибку: 500 (internal server error) - Duplicate entry for key 'likes.PRIMARY'
.
Здесь вы можете увидеть мою таблицу лайков [! [таблица лайков] [1]] [1]. В обоих столбцах есть Primary Key
и Not Null
. Я использую MySQL Workbench.
Структура HTML для лайков в каждом сообщении на странице:
<div class="like_container">
<?php if (in_array($newpost->observationID,array_column($likedposts,'liked_obs_id'))): ?>
<button class="like_button" rel="<?= $newpost->observationID?>" >
<img class="icon_like liked" id="icon_like" src="<?= base_url()?>/public/images/heart.svg" style="height: 22px">
</button>
<p class="like_counts" id="like_counts" style="font-size: 18px"><?=$newpost->likes?></p>
<?php else: ?>
<button class="like_button" rel="<?= $newpost->observationID?>" >
<img class="icon_like" id="icon_like" src="<?= base_url()?>/public/images/heart.svg" style="height: 22px">
</button>
<p class="like_counts" id="like_counts" style="font-size: 18px"><?=$newpost->likes?></p>
<?php endif; ?>
</div>
Функции PHP для обработки подобных сообщений следующие:
private $db;
public function __construct()
{
$this->db = ConfigDatabase::connect();
}
public function clickLike($user, $observation)
{
$query_text = "INSERT INTO a20ux3.likes (userID, observationID)
VALUES (:userID:, :observation:)";
$query_addLike = "UPDATE a20ux3.observations
SET likes = likes 1
WHERE observationID = :observation:";
$this->db->query($query_addLike, ['observation' => $observation]);
$this->db->query($query_text, ['userID' => $user, 'observation' => $observation]);
}
public function removeLike($user, $observation)
{
$query_text = "DELETE FROM a20ux3.likes
WHERE userID = :userID:
AND observationID = :observation:";
$query_removeLike = "UPDATE a20ux3.observations
SET likes = likes - 1
WHERE observationID = :observation:";
$this->db->query($query_removeLike, ['observation' => $observation]);
$this->db->query($query_text, ['userID' => $user, 'observation' => $observation]);
}
И JavaScript выглядит так:
$(".like_button").click(function (e){
e.preventDefault();
const button = $(this);
let num = button[0].nextElementSibling;
const base_url = '<?php echo base_url();?>';
let obs_id = button.attr("rel");
let icon = button[0].firstElementChild;
if(icon.classList.contains('liked')){
$.ajax({
type: "POST",
url: base_url "/public/LikeController/removeLike",
data: {ObsID: obs_id},
success: function (result) {
console.log("Removed");
icon.classList.remove("liked");
if ((parseInt(num.innerText) - 1) < 0){
num.innerText = parseInt("0");
}
else {
num.innerText = parseInt(num.innerText) - 1;
}
},
error: function (result) {
console.error("Unliked unsuccessful",result);
}
});
}
else {
$.ajax({
type: "POST",
url: base_url "/public/LikeController/likePost",
data: {ObsID: obs_id},
success: function (result) {
console.log("Liked");
icon.classList.add('liked');
num.innerText = parseInt(num.innerText) 1;
},
error: function (result) {
console.error("Liked unsuccessful",result);
}
});
}
});
Опять же, я хочу отметить, что эта ошибка возникает только тогда, когда я пытаюсь поставить лайк некоторым сообщениям на странице, а не всем из них. Надеюсь, кто-нибудь сможет мне помочь. Большое спасибо
[1]: https://i.stack.imgur.com/bHF1l.png
Комментарии:
1. Вы могли бы либо изменить
insert
insert ignore
, либо запуститьselect
первый и отправить обратно уведомление, если им уже понравилось …. или вы пытаетесь выяснить, почему JS отправляет дважды?2. @user3783243 Да, я пытаюсь понять, почему JS отправляет дважды. И я не понимаю, почему иногда для некоторых сообщений он не выдает ошибку