Почему он выдает внутреннюю ошибку сервера (500) из-за MySQL

#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 отправляет дважды. И я не понимаю, почему иногда для некоторых сообщений он не выдает ошибку