Отключение кнопки отправки при одновременном разрешении запуска сценария PHP при отправке формы - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть простая форма принятия, в которой есть одна кнопка, которую нажимает пользователь. При отправке формы у меня есть сценарий php, который вызывает в командной строке сценарий python, который добавляет записи в мою базу данных. Все прекрасно работает, кроме одного: я не хочу, чтобы пользователь мог нажимать кнопку более одного раза.

  • Если я отключаю кнопку с помощью javascript, мой оператор if (isset ($ _ POST ['submit'])) не оценивается как true, а затем мой php не запускается
  • Если я вызываю функцию javascript в сценарии php, у пользователя все еще есть возможность несколько раз нажать кнопку, прежде чем сценарий php вызовет функцию, чтобы отключить кнопку. Это позволяет им делать несколько записей в моей базе данных.

Моя идея состояла в том, чтобы мой сценарий python, который добавляет записи, сначала проверяет, существует ли запись с такой же информацией в БД и создать новый, только если нет. Меня беспокоит то, что если пользователь нажимает кнопку отправки несколько раз, возможно, несколько php выполнят несколько вызовов, а второй проверит, уже создана ли запись, прежде чем первый вызов создаст новую запись.
Другими словами, может быть, вызовы php будут работать одновременно (асинхронно?), И проверка базы данных не покроет другой вызов, создающий запись в то же время. Это действительная проблема?

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


Для будущих зрителей обходной путь, который я в итоге использовал , основан на том, что Теему сказал в комментариях ниже. Прежде чем добавить новую запись из формы отправки в базу данных, я проверил, существует ли запись с этой информацией. Если нет, я добавил запись, если так, то нажатие кнопки ничего не сделало. Как упомянул Teemu, эта проверка в любом случае будет необходима для покрытия нескольких заявок, которые могут быть размещены даже без кнопки на странице. Это то, что я называю «обходным путем», а не ответ, потому что пользователь все еще может нажимать кнопку «Отправить» несколько раз, но эффект имеет только первый щелчок. Затем кнопка скрывается после завершения работы php.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Все, что вам нужно, это то, что disabled установлено после , когда отправка отправлена. Вы можете достичь этого, используя setTimeout с нулевой задержкой:

$('.myForm').submit(function () {
  setTimeout(() => {
    $(this).find('[type=submit]').prop('disabled', true)
  }, 0)
})

Затем произойдет следующее:

  • Событие отправки формы запускается, потому что пользователь нажал кнопку или нажал Введите
  • Браузер вызывает ваш обработчик submit
  • Вы «активируете» свое время ожидания
  • Браузер отправляет форму на сервер ( с значением кнопки отправки)
  • Ваш тайм-аут срабатывает сразу после этого, отключая кнопку

Обратите внимание, что я использовал обработчик submit в форме вместо Обработчик click на кнопке, потому что форму можно отправить, нажав Введите , когда фокус находится и на поле формы, а не только при нажатии кнопки. Тем не менее, из-за того, как отправка формы работает , отключение кнопки также предотвратит отправку с помощью Введите .

0 голосов
/ 21 апреля 2020

У меня недавно была похожая ситуация, когда я иногда получал двойной щелчок «отказов». Вот два способа, которыми я справился с этим:

1) Просто отключите кнопку, отправьте данные AJAX на PHP и восстановите кнопку в случае успеха

$("#save_button").click(function (e) {
            e.preventDefault();
            $(this).attr("disabled", true);
            var settings = $('form').serialize();
            console.log("settings are ", settings);
            $.post("data/ajax.php", settings, function (data) {
                data = JSON.parse(data);
                console.log("data back from save is ", data);
                $("#save_button").removeAttr("disabled");
            })
        });

2) создайте Функция «nobounce» (в основном это то же самое, но с таймером. Использовать ее немного проще, поскольку она требует установки класса «nobounce» для любой кнопки, которую вы хотите отключить, хотя, как и для таймера, не так точно включить кнопку, когда сообщение закончено.

    $('.nobounce').click(function () {
        $(this).attr("disabled", true);
        setTimeout(function () {
            $('.nobounce').removeAttr("disabled");
        }, 3000);
    });

Это оба jquery метода - сохранение формы на странице. Из вашего описания кажется, что вы делаете отправьте форму через PHP (пожалуйста, если это не тот ответ, который вам нужен, укажите код, который вы используете, чтобы это было более понятно!). Если вы отправляете через PHP, то некоторые комментарии исходный вопрос чрезвычайно актуален.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...