запретить отправку больше 1 сообщения обратной формы

124
23 января 2021, 14:30
<div id="form-wrapper">
<div id="form-wrap">
    <span style="float: left">Записаться на обучение:</span>
    <form  style="float: left" id="mycontactform" method="post">
        <input name="name" type="text" placeholder="Ваше имя" />
        <input name="phone" type="text" placeholder="Телефон" />
        <span id="form-button" onclick=" ga('send', 'event', 'click', 'sign_up'); yaCounter30659347.reachGoal('form_sign_up'); return true;">Записаться сейчас</span>
    </form>
</div>
</div>

это код формы далее обработчик

<script>
$(document).ready(function(){
    $('#container').css('margin-top','41px');
    $('#form-button').click(function(){
                var btnClicked = jQuery(this);
  var formId = jQuery("#mycontactform");
  jQuery(btnClicked).prop("disabled", true);
        if($('input[name=phone]').val() != '' && $('input[name=name]').val() != '') {
            $.post("/sendmail.php",
                            $("#mycontactform").serialize(),  
                            function(response) {
                                $(this).attr('disabled', true);
                $('#form-wrapper').html(response);
                                    if (response == 'Заявка отправлена!') {
                     jQuery('#mycontactform').html('Ваша заявка отправлена! В течение 15 минут с Вами свяжется наш менеджер!');
      } else {
                   jQuery(btnClicked).prop("disabled", false);
                    jQuery('#form-wrapper').slideDown().delay(5000).slideUp();
                      }

            });
            return false;
        }
        if ($('input[name=name]').val() == '')
            $('input[name=name]').css('border', '1px solid red');
        if ($('input[name=phone]').val() == '')
            $('input[name=phone]').css('border', '1px solid red');
    });
});
</script>

файл php "/sendmail.php"

`

$to = 'avtoshkola.perekrestok@mail.ru';
$subject = 'Заявка с сайта';
$message = 'Имя: ' . $name . '<br />Телефон: ' . $phone . '</BR>Заявка со страницы сайта' . $_SERVER["HTTP_REFERER"] . '</BR>';
$headers = 'From: info@perekrestok.at' . "\r\n";
//$mess = 'Заявка с сайта' . $_SERVER["HTTP_REFERER"] . '</BR>';
$headers .= "Content-type: text/html; charset=\"utf-8\"";
$data = array(
"STATUS_ID" => "15", "OPENED" => "Y", "ASSIGNED_BY_ID" => 324,
"TITLE" => 'perekrestok.at: ЗАПИСАТЬСЯ НА ОБУЧЕНИЕ',
"NAME" => $name,
"PHONE" => array(array("VALUE" => $phone, "VALUE_TYPE" => "WORK")),
    "UF_CRM_1556619202" => $roistatVisitId,
);
$b24 = new WFB24($data);
if ( ($name != '') && ($phone != '')) { // this line checks that we have a valid email address

mail($to, $subject, $message, $headers,'-f info@perekrestok.at'); //This method sends the mail. $res = $b24->send(); echo " Ваша заявка отправлена! В течение 15 минут с Вами свяжется наш менеджер!"; // success message } else { echo "Пожалуйста, заполните корректно все поля!"; };

class WFB24
{
const CRM_LEAD_ADD = 'https://perekrestok.bitrix24.ru/rest/534/b75ppkhsaxkssarz/crm.lead.add.json';
public $queryData;
function __construct($queryData)
{
    $this->queryData = $queryData;
}
function send($url = self::CRM_LEAD_ADD)
{
    $postFields = http_build_query(array(
        'fields' => $this->queryData,
        'params' => array("REGISTER_SONET_EVENT" => "Y")
    ));
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_POST => 1,
        CURLOPT_HEADER => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $url,
        CURLOPT_POSTFIELDS => $postFields,
    ));
    $result = curl_exec($curl);
    curl_close($curl);
    $result = json_decode($result, 1);
    return $result;
}
}`

Помогите отредактировать код чтобы сообщение приходила не больше ого штуки за раз

Answer 1

как мне кажется вариантов несколько (их можно дополнять):

Простые варианты:

1) Воспользоваться localStorage. Отправили сообщение, изменили ключ (например isSend) в localStorage. При повторной отправке с клиента проверяйте этот ключ.

localStorage.setItem('isSend', true);
localStorage.getItem('isSend'); // если не true - делайте отправку

Повторная отправка решается очисткой localStorage, заходом с другого браузера или включением режима инкогнито - для простого юзера может и сойдет.

2) Присылать с сервера cookie. Запрос прошел успешно, вернули cookie. Или устанавливать cookie прямо с клиента.

Решается отключением кук на сайте, заходом с другого браузера или включением режима инкогнито

Более сложные: (если такие варианты для вас возможны)

3) Давать отправлять только авторизованным пользователям = у вас будет идентификатор клиента и вы сможете ограничить количество запросов.

4) Отправка кода подтверждения на телефон и дальнейшая проверка кода = нужен сервис для отправки смс = скорее всего придется платить.

5) Ограничение количества запросов по IP адресу клиента = решается заменой IP например в браузере ТОР.

6) Ограничение количества запросов по номеру телефона клиента = любой человек сможет ввести не свой номер телефона.

Лучшим вариантом считаю пункты 3 и 4

P.S: еще есть куча вариантов, но 100% вариантов избежать повторную отправку скорее всего нет. Все зависит от уровня юзеров.

Answer 2

Можно при первом нажатии создать переменную i, которая изначально = 0. И добавить проверку на нажатие if(i=0){}else{i++;} После чего выводить сообщение, мол уже отправлено.

READ ALSO
Как решить C:\fakepath

Как решить C:\fakepath

Как отправить txt (или любой другой) файл на сервер указывая правильный путь?

132
Сделать падение объекта

Сделать падение объекта

Хотелось бы увидеть, как возможно реализовать на css падение какого-то маленького объекта по касательной, ну или допустим падающую звезду...

223
Разложение ряда S(y) функции

Разложение ряда S(y) функции

Задание состоит в том, чтобы написать программу вывода графиков функции y(x) для аргумента x, изменяющегося от a до b с шагом h (вводится с клавиатуры)...

74