Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Удаление записи бд с помощью Ajax (https://javascript.ru/forum/events/72047-udalenie-zapisi-bd-s-pomoshhyu-ajax.html)

mazahaler 03.01.2018 18:33

Удаление записи бд с помощью Ajax
 
Вложений: 1
Здравствуйте, у меня есть список документов, который выводится из БД.
Выглядит это так, как показано на скриншоте.
Я сделал удаление записи, удаляет оно верно, вот код jquery:
$(function(){
    $("#docsslavep").one("click",function(){
        $('#ajaxsuccessdoc').find('.doctext2').each(function(i, elem) {
        $( '#ajaxsuccessdoc' ).on('click','#removeslaved'.concat(i),function() {

            var id=$('.IDDD'.concat(i)).text();
            $.ajax({
                type:"POST",
                url: "Removedslave.php",
                data:{id:id},
                success:function(data){

                    $('#doctext').html(data);
                }
            });
        });
    });
    });
});

А проблема вот в чем: допустим есть 3 документа. Когда я удаляю последний документ, то из списка документов пропадает не последний документ, а первый. Но после перезагрузки страницы все нормально, удаляет нужный документ.
Скорее всего это связано с
success:function(data){

                    $('#doctext').html(data);
                }

#doctext - это блок, в котором отображается вся информация о документе.
Не знаю, поняли ли вы что я тут написал. Но в любом случае, как я могу это исправить?

laimas 03.01.2018 18:48

Цитата:

Сообщение от mazahaler
Я сделал удаление записи, удаляет оно верно, вот код jquery:

Клиент ни посредством jQuery, ни чем иным никак не может удалить запись в БД на сервере, удаляется все серверным скриптом. А то что вы показываете, это всего лишь клиентский интерфейс и результат удаления он отобразит ровно такой, какой ему сообщит сервер. Если результат клиент отображает кривой, то причину этого нужно искать на сервере.

mazahaler 03.01.2018 18:50

laimas,
в php скрипте у меня просто запрос на удаление. Ничего больше.

laimas 03.01.2018 18:57

Цитата:

Сообщение от mazahaler
в php скрипте у меня просто запрос на удаление. Ничего больше.

И чего вы тогда ожидаете от клиента?

mazahaler 03.01.2018 19:00

laimas,
тоесть кроме удаления я просто должен сделать выборку и вывод? Или я могу как-то проще рефрешнуть данные?

laimas 03.01.2018 19:06

mazahaler,
перечитайте свой первый пост. Если судить по логике, то вообще не понять о чем там.

Если сервер удаляет, но удаляет не то, что запрашивается, то это разработчик, то есть вы, накосячил с параметрами запроса.

Запрос клиента, да еще с операциями в БД не должен быть односторонним, клиент должен получить ответ либо об успехе операции, либо о возникших ошибках.

mazahaler 03.01.2018 19:14

laimas,
удаляет нужный документ, но сразу после удаления отображается так, будто-бы удалился первый документ, а не последний. НО после перезагрузки все отображает корректно.
Пример:
Докумнет 1.
Документ 2.
Документ 3.
Удаляю Документ 3.
Результат сразу после удаления:
Документ 2.
Документ 3.
Результат после перезагрузки страницы:
Документ 1.
Документ 2.
Тоесть удаляет все верно, но показывает некорректно сразу после удаления. В БД также удаляет корректно.

laimas 03.01.2018 19:16

Цитата:

Сообщение от mazahaler
удаляет нужный документ, но сразу после удаления отображается так, будто-бы удалился первый документ, а не последний. НО после перезагрузки все отображает корректно.

Еще раз повторяю - а чего вы ждете от клиента, если в php скрипте у меня просто запрос на удаление. Ничего больше., но при этом success:function(data){ $('#doctext').html(data); }?

laimas 03.01.2018 19:19

Вот это что такое?

$("#docsslavep").one("click",function(){
        $('#ajaxsuccessdoc').find('.doctext2').each(function(i, elem) {
            $( '#ajaxsuccessdoc' ).on('click','#removeslaved'.concat(i),function() {

mazahaler 03.01.2018 19:28

laimas,
Кликаю на кнопку - > перебираю все документы с классом "doctext2" -> Кликаю на кнопку "Удалить".
Далее по коду понятно.

laimas 03.01.2018 19:38

Цитата:

Сообщение от mazahaler
Кликаю на кнопку - > перебираю все документы с классом "doctext2" -> Кликаю на кнопку "Удалить".

Даже комментировать не понятно как на такое. Что такое форма вам известно?

mazahaler 03.01.2018 19:39

laimas, известно.

laimas 03.01.2018 19:40

А коли известно, то к чему выдумывать "кошмарики"?

mazahaler 03.01.2018 19:49

laimas,
просто хотелось бы сделать сие действие без перезагрузки страницы.

laimas 03.01.2018 20:18

Цитата:

Сообщение от mazahaler
просто хотелось бы сделать сие действие без перезагрузки страницы.

А проблема не в Ajax, а ваших действиях, и это кошмар. А форма не является "спецификой исключительно не Ajax запросов".

Пусть вы запрашиваете для редактирования в базе три записи. Для простоты пусть это будет правка заголовков, а также можно удалять записи.

При этом можно выполнить операции сразу для всех строк - групповое редактирование (выбор в форме и ее отправка), а можно производить индивидуальное редактирование каждой записи, отправляя запрос для каждой записи отдельно.

Как при этом будет происходить обмен с сервером не важно. При групповом редактировании можно поступить так:

<form>
    <input name="title[15]" /> <input type="checkbox" name="del[]" value="15" />
    <input name="title[35]" /> <input type="checkbox" name="del[]" value="35" />
    <input name="title[75]" /> <input type="checkbox" name="del[]" value="75" />
    <button>Обновить</button>
</form>


где числа, это уникальные идентификаторы записей в БД. Изменив значения полей title или выбрав флажок для удаления записи, отправляем форму, которая имеет обработчик события onsubmit:

$('form').submit(function(e) {
        e.preventDefault();
        $.ajax({
            //....
            data: $(this).serialize(), //данные формы
            //....
        })
    })


Сервер получая запрос проверяет есть ли записи для удаления/обновления и производит операции:

if($del = array_diff(array_map('intval', $_POST['del']), [0])) {
    $_POST['title'] = array_diff_key($_POST['title'], array_flip($del)); //убрать из полей формы записи для удаления
    //удаляем записи для WHERE id IN(implode(',', $del))
}
if($_POST['title']) { //есть ли записи для обновления
    //обновление    
}
//возврат клиенту результата запроса


Ответом может быть запрос в базу, если были обновления, что и будет отражено на клиенте, то есть состояние БД после запроса.

То что у вас в событии перебор и куча событий наряду с выбором...

Индивидуальный подход, это всего лишь отдельный запрос по каждой записи (ее параметров), и клиенту достаточно знать только положителен или отрицателен результата запроса, и если положителен и было выбрано удаление, то удалить из формы элементы удаленной записи. В данном случае нужно еще добавить на клиенте и анализ выбранной операции.

mazahaler 03.01.2018 20:27

laimas,
спасибо вам большое за разъяснения!


Часовой пояс GMT +3, время: 16:52.