AJAX-запрос работает с перебоями. Как такое может быть?

M2
На сайте с 11.01.2011
Offline
321
210

В общем суть такая....

Есть некая разметка:


<td><div id="channel-1"><a href="#" onclick="update_channel_comment(1)">комментарий</a></div></td>

Человек кликает по этому комментарию-ссылке, и ему вместо него выскакивает поле для ввода:


<input type=\"text\" id=\"channelComment\" onBlur=\"insert_channel_comment("+channelID+", "+commentValue+")\">

Он такой вводит новый комментарий и всё, коммент обновляется в базе и челу в ответ выводится такая же ссылка с новым комментарием.

Это идея. Теперь о том, как это работает...

update_channel_comment(channelID)


function update_channel_comment(channelID) {
var channel = "#channel-"+channelID;
var commentValue = $(channel).val();
var html = "<input type=\"text\" id=\"channelComment\" onBlur=\"insert_channel_comment("+channelID+", "+this.value+")\">";
$(channel).html(html);

}

insert_channel_comment(channelID, commentValue)


function insert_channel_comment(channelID, commentValue) {
if (commentValue !== '') {
$.ajax({
type: 'POST',
datatype: 'json',
url: '/includes/ajax.php?request=insert_channel_comment',
data: {'channel_id':channelID, 'comment':commentValue},
success: function(data) {
var json = $.parseJSON(data);

if (json.success == true) {
var html = "<a href=\"#\" onclick=\"update_channel_comment("+json.channel_id+")\">"+json.updated_comment+"</a>";
var elem_id = "#channel-"+json.channel_id;

$(elem_id).html(html);
}

else {
alert(json.error);
return false;
}
}
});
}

else {
alert('Empty comment!');
}

и, наконец, сама реализация запроса:


if ($_GET['request'] == 'insert_channel_comment') {
$channel_id = $_POST['channel_id'];
$comment = $_POST['comment'];

global $sql;
$data['channel_id'] = (int)$channel_id;
$query = "UPDATE channels SET channel_comment = '".$sql->real_escape_string($comment)."' WHERE id = '".$channel_id."'";
$sql->query($query);
if (empty($sql->error)) {
$query = "SELECT channel_comment FROM channels WHERE id = '".$channel_id."'";
$result = $sql->query($query);
$result_row = $result->fetch_row();
$data['updated_comment'] = $result_row[0];
$data['success'] = true;
}

else {
$data['success'] = false;
$data['error'] = $sql->error;
}


die(json_encode($data));

}

В принципе это работает, но... как-то странно.... добавляю коммент - добавляется. Изменяю - пустая строка. Изменяю второй раз - всё ок. Третий раз - всё ок. Четвертый раз - пустая строка. Никак не могу понять закономерность, а самое главное - выяснить, в чём прикол. PHP знаю, ajax знаком, вроде выводится всё то, дебажил, выводил различные переменные, всё норм... не могу понять, откуда такой странный глюк.

------------------- Крутые VPS и дедики. Качество по разумной цене (http://cp.inferno.name/view.php?product=1212&gid=1) VPS25OFF - скидка 25% на первый платеж по ссылке выше
Samail
На сайте с 10.05.2007
Offline
328
#1

Я бы для начала сравнил запросы которые к ajax.php идут одинаковые они или нет в случаях когда всё нормально и когда "глючит".

Aisamiery
На сайте с 12.04.2015
Offline
206
#2

У вас тут по коду SQL Injection

$query = "UPDATE channels SET channel_comment = '".$sql->real_escape_string($comment)."' WHERE id = '".$channel_id."'";

и

$query = "SELECT channel_comment FROM channels WHERE id = '".$channel_id."'";

надо поправить на


$channel_id = (int) $_POST['channel_id'];

Так же у вас не проверяется что коммент не пустой и в целом конечно тут всё так себе

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий