мой вызов ajax получает правильный ответ, но ничего не делает - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь сделать кнопку "нравится / не нравится" в ajax.Ajax отправляет мои данные в отдельный файл, где они сохраняются в базе данных, и этот файл возвращает успешный ответ {"status":"success","message":"Like has been saved.","data":{"like":"1"}}, полученный мной из окна ответа сети Chrome.Однако код в $ajax(...) .done не работает

У меня есть console.logged и var.dumped каждый бит кода, который я мог бы.мои данные отправляются в мою базу данных, что должно означать, что SQL и тому подобное класс является правильным.Я также попытался просто console.log дать ответ «res» и поместить остальные в комментарии, но это опять же ничего не дает мне


<div>
    <a href="#" data-id="<?php echo $post->id ?>" class="like">Like</a>  
    <a href="#" data-id="<?php echo $post->id ?>" class="dislike" style="display:none;">Dislike</a>
    <span class='likes' data-id="<?php echo $post->id ?>"><?php echo $post->getLikes(); ?></span> people like this
</div>

$("a.like, a.dislike").on("click",function(e){
      var postId = $(this).data("id");
      if($("a.like")){
        var type = 1;
      }else if($("a.dislike")){
        var type = 0;
      }
      var elLikes = $(this).siblings(".likes");
      var likes=elLikes.html();

      $.ajax({
          method: "POST",
          url: "ajax/postlike.php",
          data: {postId: postId, type:type},
          dataType: "json",
      })
      .done(function( res ) {
          console.log(res);
          if(res.status=="succes"){
              console.log(res);

              if(res.data.like=="1"){
                  likes++;
                  elLikes=html(likes);
                  $("a.like").css("display","none");
                  $("a.dislike").css("display","inline-block");

              } else if(res.data.like=="0"){
                  likes--;
                  elLikes=html(likes);
                  $("a.dislike").css("display","none");
                  $("a.like").css("display","inline-block");
              }
          }
      });
      e.preventDefault();

});

if(!empty($_POST)){
        try {
            $postId=$_POST['postId'];
            $type=htmlspecialchars($_POST['type']);
            $userId=$_SESSION['user_id'];

            $l = new Like();
            $l->setPostId($postId);
            $l->setUserId($userId);
            $l->setType($type);
            $l->save();

            $res = [
                "status" => "success",
                "message" => "Like has been saved.",
                "data" =>[
                    "like" => $type
                ]
            ];

        }catch (trowable $t) {
            $res = [
                'status' => 'failed',
                'message' => $t->getMessage()
            ];
        }
        echo json_encode($res);
        var_dump($res);
    }

то, что я ожидал, былочто Ajax отправил данные JSON в код php, который поместил их в базу данных, и это работает.Затем дает успешный ответ на Ajax, также работает.Затем Ajax будет выключать кнопки «нравится / не нравится», добавляя или выбирая «1» из диапазона «лайки».Однако он абсолютно ничего не делает

Я почти на 100% уверен, что проблема в том, что я что-то глупо вижу, но я действительно не могу ее найти.

Ответы [ 3 ]

0 голосов
/ 16 мая 2019

Опечатка в 'успех' в он-лайн: if(res.status=="succes"){

0 голосов
/ 16 мая 2019

Вы можете попробовать это:

error: function(xhr, status, error) { 
    console.log(error)
},
success: function(response) {
    console.log(response)
}

в вашей функции Ajax, чтобы узнать, что происходит на стороне сервера с ответом.

0 голосов
/ 16 мая 2019

Если вы указываете тип возвращаемых данных для ожидаемого ajax-запроса, а фактическое возвращаемое значение не соответствует указанному вами, то ваша функция error / fail будет срабатывать, если она у вас есть. Это связано с тем, что добавление dataType: "json" заставляет вас ajax попытаться проанализировать возвращаемое значение как json, а в случае сбоя запускает ваш обработчик ошибок. Лучше всего опустить dataTaype, а затем добавить пробный улов с JSON.parse в вашей готовой функции, чтобы обойти это.

* 1005 например *

.done(function (string_res) {
    console.log(string_res);
    try {
        var json_obj = JSON.parse(string_res);
        console.log(json_obj);
    } catch (e) {
        console.log('failed to parse');
    }   
    // do work/operations with json_obj not string_res
})
.fail(function (jqXHR, textStatus) {
    console.log('failed')
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...