Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.05.2019, 05:25
Интересующийся
Отправить личное сообщение для hardway Посмотреть профиль Найти все сообщения от hardway
 
Регистрация: 23.08.2017
Сообщений: 12

Почему-то не передаются данные через Ajax
Есть следующий код JS, который ловит нажатие на кнопку и отправляет данные data-id в обработчик:
$(document).ready(function() {
$("#like<?=$id_mes?>").bind("click", function(event) {
$.ajax({
url: "like.php",
type: "POST",
data: {id: $("#like<?=$id_mes?>").attr("data-id")},
complete: function() {
$("#likes<?=$id_mes?>").text(Number($("#likes<?=$id_mes?>").text()) + 1);
$("#userr<?=$id_mes?>").text(Number($("#userr<?=$id_mes?>").text()) + 1);
},
dataType: "text"
});
});
});

А вот собственно сама кнопка с полями, где будет делаться инкремент:
<input type="button" value="Лайк" id="like<?=$id_mes?>" data-id="<?=$id_mes?>">
<span id="likes<?=$id_mes?>"><?=$arr_messages[$i]['likes']?></span> лайков
Симпатий:<span class="right" id="userr<?=$id_mes?>"><?=$arr_user[0]['sympathy']?></span>

Это сам обработчик:
<?php
$mysqli = new mysqli('localhost', 'root', '', 'phpuse');
$mysqli->set_charset('utf8');
$id = $_POST['id'];
$mysqli->query("UPDATE `messages` SET `likes` = `likes` + 1 WHERE `id` = '$id'");
$user = $mysqli->query("SELECT `login` FROM `messages` WHERE `id` = '$id'");
$user = $user->fetch_assoc();
$user = $user['login'];
$mysqli->query("UPDATE `users` SET `sympathy` = `sympathy` + 1 WHERE `login` = '$user'");
$mysqli->close();

А теперь к самому вопросу: почему данные передаются некорректно? Некорректно, потому что используя метод отправки GET данные в БД меняются, а вот с POST — нет.
Ответить с цитированием
  #2 (permalink)  
Старый 28.05.2019, 07:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Не надо таких ужасов #like<?=$id_mes?> там, где это ничем не оправдано. У кнопок есть свойство value, в которое и нужно помещать идентификатор <?=$id_mes?>, и коли речь о множестве кнопок, то определить им класс (если кроме них есть иные кнопки, иначе селектором может быть и просто имя тега), по которому как селектору установить обработчик. А в обработчике кнопка будет доступна как this, и ее значение как this.value. Все сопутствующие ей элементы также могут быть доступны без всяких id.

А вот так вообще очень вредно поступать для здоровья базы:

$id = $_POST['id'];
$mysqli->query("UPDATE `messages` SET `likes` = `likes` + 1 WHERE `id` = '$id'");
$user = $mysqli->query("SELECT `login` FROM `messages` WHERE `id` = '$id'");
Ответить с цитированием
  #3 (permalink)  
Старый 28.05.2019, 10:14
Интересующийся
Отправить личное сообщение для hardway Посмотреть профиль Найти все сообщения от hardway
 
Регистрация: 23.08.2017
Сообщений: 12

laimas, я знаю, что в моём коде много лишнего, но я не спрашиваю о том, как мне это сократить, а спрашиваю это:
Цитата:
А теперь к самому вопросу: почему данные передаются некорректно? Некорректно, потому что используя метод отправки GET данные в БД меняются, а вот с POST — нет.
Ответить с цитированием
  #4 (permalink)  
Старый 28.05.2019, 10:33
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Метод отправки не влияет, можно любым методом передать. А вот кошмар на странице как раз и может повлиять на неразбериху. Например, кнопки то можно иметь и такие:

<button name="id" value="<?=$id_mes?>"><span>1</span> голоса <span>2</span> симпатии</button>


И отправлять так:

$(function() {
    $('button').click(function() {
        var btn = $(this);
        $.ajax({
            url: "like.php",
            type: "POST",
            data: this.name+'='+this.value,
            dataType: 'json', //можно и текстом оперировать, по соглашению
            success: function(data) {
                if(!data.error) { //только если сервер не вернул ошибки
                    btn.children().text(function() {
                        return ++this.textContent
                    })
                }
            },
        })
    });
});


И все будет работать без запинки, это легко проверить. У вас в чем-то косяки, но по представленному не понять.

А вот с базой, это нужно знать обязательно. Если уж не используете метки доступные в mysqli, то запрос можно в данном случае производить по условию:

if($id = (int)$_POST['id']) {
    //здесь запросы 
} else //ошибка
//ответ клиенту
....
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести через JS данные lmi2002 AJAX и COMET 4 29.05.2017 13:39
Ajax запрос через метод submit() n0kkw1n AJAX и COMET 7 16.12.2016 22:47
Взять данные через ajax Davert Tanz AJAX и COMET 1 24.07.2014 00:25
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Передача HTML кода на сервер через Ajax KomaLex AJAX и COMET 2 06.12.2012 15:28