Счетчик отправленных форм на php/валидация формы/подключение reCAPTCHA

163
24 января 2022, 11:10

Я пытаюсь реализовать счетчик отправки формы на php, если данные с формы отправляются на сервер, в файл counter.txt записывается +1, потом эти данные используются для формирования заголовка в письме как № заявки. Все работает, но на почту приходит 12 одинаковых писем, при следующей отправке 32 и тд. В чем проблема? Почему это происходит?

  <?php

$email = trim(strip_tags($_POST['f']['sel']));
$change = trim(strip_tags($_POST['f']['button-set']));
$name = trim(strip_tags($_POST['f']['name']));
$question = trim(strip_tags($_POST['f']['message']));
$submit = trim(strip_tags($_POST['f']['submit'])); 
if(isset($submit)){
    $count = file_get_contents('counter.txt'); 
    $count++;
    file_put_contents('counter.txt',$count); 
}
else {
    $count = file_get_contents('counter.txt');
};
$to = 'support@archsupport.ru'; 
$subject = 'Заявка №:' . $count . ' с сайта archsupport.ru'; 
$message = 'Имя: ' . $name . "\r\n" . 'Контакты: ' . $email . "\r\n" . 'Написать ' . $change . "\r\n" . 'Вопрос: ' . $question  ; 
$headers = 'From: zergg52@gmail.com ' . "\r\n";
$subject = preg_replace("/(\r\n)|(\r)|(\n)/", "", $subject);
$subject = preg_replace("/(\t)/", " ", $subject);
$subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
@mail($to, $subject, $message, $headers);
echo 'сообщение отправлено!';
?>

Код страницы:

var form  = document.getElementsByTagName('form')[0]; 
var names = document.getElementById('name'); 
var validn = document.getElementById('vn'); 
var iconrequired = document.querySelector('#namereq'); 
var email = document.getElementById('sellection'); 
var valids = document.getElementById('vs'); 
var iconrequireds = document.querySelector('#sellectionreq'); 
var text = document.getElementById('qestions'); 
var validt = document.getElementById('vt'); 
var iconrequiredt = document.querySelector('#textreq'); 
 
 
document.addEventListener('input', function validation() { 
 
	var x = document.forms["support"]["sellection"].value; 
 
 
  if (names.validity.valid) { 
    validn.className = "valid"; 
		iconrequired.className = "iconrequired hide"; 
	 
		}; 
	 
	if (email.validity.valid && x != "")	{ 
 
		 valids.className = "valid"; 
		iconrequireds.className = "iconrequired hide"; 
 
		}; 
	if (text.validity.valid)	{ 
			validt.className = "valid"; 
			iconrequiredt.className = "iconrequired hide"; 
		 
		}; 
	if (!names.validity.valid) { 
	validn.className = "invalid"; 
		iconrequired.className = "iconrequired hide"; 
	 
		}; 
		if (!email.validity.valid) { 
			valids.className = "invalid"; 
		iconrequireds.className = "iconrequired hide"; 
		 
		}; 
		 
		if (!text.validity.valid){ 
			validt.className = "invalid"; 
		iconrequiredt.className = "iconrequired hide"; 
 
		};	 
		 
if (names.validity.valid && email.validity.valid && text.validity.valid){	 
 
		$('#support').submit(function(){ 
		     
    $.post( 
        'https://www.archsupport.ru/post-email.php', // адрес обработчика 
         $("#support").serialize(), // отправляемые данные           
   
        function(msg) { // получен ответ сервера   
            $('#support').hide('slow'); 
            $('#my_message_email').html(msg); 
        } 
    ); 
     
     
}); 
 
  
		} else { 
		 
		return false; 
		 
		} 
}); 
 
 
 
 
 
		function validateSellection(){ 
var x=document.forms["support"]["sellection"].value; 
if (x === "") { 
document.getElementById('sellectionreq').classList.remove("hide"); 
return false; 
} else { 
document.getElementById('sellectionreq').classList.add("hide"); 
return false; 
} 
}; 
	function validateName(){ 
var x=document.forms["support"]["name"].value; 
if (x === "") { 
document.getElementById('namereq').classList.remove("hide"); 
return false; 
} else { 
document.getElementById('namereq').classList.add("hide"); 
return false; 
} 
}; 
 
	function validateText(){ 
var x=document.forms["support"]["qestions"].value; 
if (x === "") { 
document.getElementById('textreq').classList.remove("hide"); 
return false; 
} else { 
document.getElementById('textreq').classList.add("hide"); 
return false; 
} 
}; 
 
$('#support').submit(function validate(){ 
if(validateName() && validateSellection() && validateText()===true){ 
 
return ; 
} else { 
 
validateSellection(); 
validateName(); 
validateText() 
return false 
 
} 
}); 
 
 
 
$(".radio").on('click.two', function() { 
      let input = $("#sellection"); 
      if ($("#radio").prop("checked")) { 
        input.prop("disabled", false); 
        input.prop({ 
				"type": "email", 
          "placeholder": "example@yourmail.ru", 
          "autocomplete": "email", 
          "maxlength": "35", 
          "minlength": "12", 
					"value": "", 
        }); 
        document.getElementById("sellection").pattern = "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$"; 
      } else { 
        input.prop("disabled", false); 
        $("#sellection").prop({ 
				"type": "tel", 
          "placeholder": "+7-910-205-46-15", 
          "autocomplete": "tel", 
          "maxlength": "16", 
          "minlength": "11", 
					"value": "", 
        }); 
        document.getElementById("sellection").pattern = "\\+7\\s?[\\(]{0,1}9[0-9]{2}[\\)]{0,1}\\s?\\d{3}[-]{0,1}\\d{2}[-]{0,1}\\d{2}"; 
      } 
      input.focus(); 
      input.val(""); 
    }); 
     
var iconsel = $('.icons'); 
iconsel.on('click.ten', function iconback() { 
	iconsel.removeClass('checked'); 
  $(this).addClass('checked'); 
});
  @font-face { 
  font-family: "HelveticaNeueCyr-Thin"; 
  src: url("/fonts/HelveticaNeueCyr-Thin.ttf") format("truetype"); 
  font-style: normal; 
  font-weight: normal; 
  font-display: swap; 
   } 
 
@keyframes req { 0% { transform:translatex(0px)    ; } 100% { transform:translatex(5px)   ; } } 
  
 @keyframes inv { 0% { opacity:.5   ; } 100% { opacity:1    ; } } 
 
* { 
	padding:0; 
	margin:0; 
} 
 
 
:root { 
	font-family: "HelveticaNeueCyr-Thin"; 
	font-weight:100; 
} 
 form { 
   font-size: 24px; 
   position: relative; 
   width:100%; 
   display: inline-flex; 
   flex-direction: column; 
 } 
 
  
 
 
 textarea { 
   height: 30vh; 
   border-radius: 18px; 
   padding-left: 15px; 
	 padding-top:10px; 
   border: 2px solid #d7d7d7; 
   overflow: hidden; 
   overflow-y: scroll; 
   outline: none; 
   resize: none 
 } 
 
 input, 
 textarea { 
   font-family: "HelveticaNeueCyr-Thin"; 
   font-weight: 100; 
   font-size: 18px; 
 } 
 
 ::-webkit-input-placeholder { 
   color: gray; 
   font-size: 18px; 
 } 
 
 ::-moz-placeholder { 
   color: gray; 
   font-size: 18px; 
 } 
 
 /* Firefox 19+ */ 
 :-moz-placeholder { 
   color: gray; 
   font-size: 18px; 
 } 
 
 /* Firefox 18- */ 
 :-ms-input-placeholder { 
   color: gray; 
   font-size: 18px; 
 } 
input:not([type="submit"]) { 
 	border-radius:100px; 
	padding-left:15px; 
 	height:36px; 
	border:none; 
	background: #f3f3f3; 
 } 
  
 input:focus { 
 	outline:none; 
  border:2px solid #f3f3f3; 
	box-sizing:border-box; 
	background:white; 
	padding-left:13px; 
	 
 } 
 
 .required { 
  display:inline-flex; 
	width:100%; 
	flex-direction: column; 
	margin-bottom: 15px; 
	position:relative; 
 } 
 .iconrequired{ 
 	margin:auto; 
 	display:flex; 
	align-items: center; 
  justify-content: center; 
 	width:90px; 
	height:14px; 
	color: white; 
	border-radius:100px; 
 	font-size:10px; 
	font-weight:100; 
	font-family: "HelveticaNeueCyr-Thin"; 
	background:#343434; 
	position:absolute; 
	right:15px; 
	top: 10px; 
	opacity:1; 
	transition: opacity ease-out 1s; 
	animation: .05s ease-in-out 0s 4 alternate req; 
   
		} 
 
	 
 
 input:-webkit-autofill, 
 input:-webkit-autofill:hover, 
 input:-webkit-autofill:focus, 
 input:-webkit-autofill:active { 
   transition: background-color 5000s ease-in-out 0s; 
	 border:2px solid #f3f3f3; 
	 box-sizing:border-box; 
	 padding-left:13px; 
	  
 } 
 
 
 div.button-set { 
   display: inline-flex; 
 } 
  
 
 div.button-set>label { 
   position: relative; 
   flex: 0 0 auto; 
   height: 50px; 
   width: 50px; 
   margin-left: 15px; 
   border-radius: 100px; 
   outline: none; 
   border: none; 
   margin-bottom: 20px; 
 
 } 
  
 
 .checked { 
   background: #f3f3f3; 
   border-radius: 100px; 
 } 
 
 input[type="submit"] { 
   font-family: "HelveticaNeueCyr-Thin"; 
   height: 36px; 
   width: 160px; 
   font-weight: 100; 
   font-size: 24px; 
   margin-top: 20px; 
   margin-left: 10px; 
   border: none; 
   border-radius: 100px; 
	 background: #f3f3f3; 
	 padding:0; 
 } 
 ::-webkit-scrollbar { 
   position: absolute; 
   z-index: 9999; 
   width: 5px; 
 } 
 
 ::-webkit-scrollbar-button { 
   display: none; 
 } 
 
 ::-webkit-scrollbar-track { 
   z-index: 9999; 
   background-color: transparent; 
 } 
 
 ::-webkit-scrollbar-track-piece { 
   z-index: 9999; 
   z-index: 9999; 
   background-color: transparent; 
 } 
 
 ::-webkit-scrollbar-thumb { 
   z-index: 9999; 
   background-color: #d7d7d7; 
   border-radius: 3px; 
 } 
 
 ::-webkit-scrollbar-corner { 
   z-index: 9999; 
   background-color: #d7d7d7; 
 } 
 
  
  
 .invalid { 
 
 
 	width:12px; 
	height:12px; 
	color: white; 
	position:absolute; 
	right:15px; 
	top: 12px; 
  background:tomato; 
	border-radius:6px; 
	animation: 2s ease-in-out 0s infinite alternate inv; 
 } 
  .valid { 
 	width:12px; 
	height:12px; 
	color: white; 
	position:absolute; 
	right:15px; 
	top: 12px; 
	background:#9dc46b; 
	border-radius:6px; 
	animation: 2s ease-in-out 0s infinite  alternate inv; 
 } 
.error { 
	text-align:right; 
	font-size:12px; 
	padding-right:20px; 
	padding-top:10px; 
	color:gray; 
	letter-spacing:.05em; 
} 
 .hide { 
 	display:none; 
   
 }
<!DOCTYPE html> 
<html lang="ru"> 
  <head> 
    <meta charset="utf-8"> 
    <link rel="stylesheet" href="/css/form.css"> 
  </head> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
  <body> 
    <form novalidate action="" method="post" name="support" id="support" > 
		<label class="required"><span id="vs" class="invalid hide"></span><input id="sellection" class="mail sellection" name="f[sel]" vlaue="" placeholder="выбери удобный способ связи ниже...."  required disabled><span id="error1"></span><div id="sellectionreq" class="iconrequired hide">ОБЯЗАТЕЛЬНОЕ</div></label> 
      <div class="button-set"> 
        <label title="Почта"><img class="icons" src='/img/icon/social_icon_mail_white.svg'><input class="radio" id="radio" type="radio" name="f[button-set]" value="на почту" style="display:none;"></label> 
 
        <label for="radio1" title="WhatsApp"><img class="icons" src='/img/icon/social_icon_whatsapp_white.svg'><input class="radio" id="radio1" type="radio" name="f[button-set]" value="в WhatsApp" style="display:none;"></label> 
 
        <label for="radio2" title="Telegram"><img class="icons" src='/img/icon/social_icon_telegram_white.svg'><input class="radio" id="radio2" type="radio" name="f[button-set]" value="в Telegram" style="display:none;"></label> 
 
<label for="radio3" title="Viber"><img class="icons" src='/img/icon/social_icon_viber_white.svg'><input class="radio" id="radio3" type="radio" name="f[button-set]" value="в Viber" style="display:none;"></label> 
      </div> 
			<label class="required"><span id="vn" class="invalid hide"></span> 
			<input id="name" class="mail" type="name" name="f[name]" autocomplete= none placeholder="как к тебе обращаться...." value="" pattern="[А-Яа-яЁё]+(\s+[А-Яа-яЁё]+)?" maxlength="15" minlength="2" required><div id="namereq" class="iconrequired hide">ОБЯЗАТЕЛЬНОЕ</div></label> 
      <label class="required"><span id="vt" class="invalid hide"></span><textarea id="qestions" type="text" placeholder="введи текст своего вопроса...." name="f[message]" value="" pattern="[А-Яа-яЁё]+(\s+[А-Яа-яЁё]+)?" maxlength="4000" minlength="45" required></textarea><div id="textreq" class="iconrequired hide">ОБЯЗАТЕЛЬНОЕ</div></label>   
      <input name="f[submit]" type="submit" id="submit" value="ОТПРАВИТЬ" /> 
    </form> 
		<div id="my_message_email"></div> 
  </body> 
</html>

Answer 1

Дело, естественно, было не в обработчике на стороне сервера,а в криво написанном Jquery вперемешку с JavaScript. Я переписал все сам, на чистом JS и теперь все в рабочем состоянии. Конечно, я понимаю, что код не очень хорош, он грязный и там много лишнего, но все же он работает. Может быть кому-то понадобиться, как пример.

В этой форме я попытался реализовать такие функции как:

На стороне браузера:

  • валидация полей формы в браузере в реальном времени;

  • дополнительное выделение пустых обязательных полей при отправке;

  • отправка формы с помощью XMLHttpRequest() (без перезагрузки страницы).

  • подключение reCAPTCHAv2

На стороне сервера:

  • простая проверка полей формы;

  • проверка reCAPTCHA;

  • счетчик отправленных форм для формирования заголовка письма по типу: "Заявка № 384 с сайта example.ru" (для того чтобы письма не группировались и их было удобно читать);

  • отправка данных с формы на почту.

Форма обратной связи:

var forms = document.getElementById('support'); 
var names = document.getElementById('name'); 
var validn = document.getElementById('vn'); 
var iconrequired = document.getElementById('namereq'); 
var email = document.getElementById('sellection'); 
var valids = document.getElementById('vs'); 
var iconrequireds = document.getElementById('sellectionreq'); 
var text = document.getElementById('qestions'); 
var validt = document.getElementById('vt'); 
var iconrequiredt = document.getElementById('textreq'); 
 
 
//ВАЛИДАЦИЯ ПОЛЕЙ ФОРМЫ 
document.addEventListener('input', validateform); 
 
function validateform() { 
 
  var x = document.forms["support"]["sellection"].value; 
 
  if (names.validity.valid) { 
    validn.className = "valid"; 
    iconrequired.classList.add("hide"); 
  } 
 
  if (email.validity.valid && x !== "") { 
    valids.className = "valid"; 
    iconrequireds.classList.add("hide"); 
  } 
 
  if (text.validity.valid) { 
    validt.className = "valid"; 
    iconrequiredt.classList.add("hide"); 
  } 
 
  if (names.validity.valid && email.validity.valid && !email.hasAttribute('disabled') && text.validity.valid === true) { 
 
    iconrequiredt.classList.add("hide"); 
    iconrequireds.classList.add("hide"); 
    iconrequired.classList.add("hide"); 
 
    return true 
 
  } else { 
 
    if (!names.validity.valid) { 
      validn.className = "invalid"; 
      iconrequired.classList.add("hide"); 
 
    } 
 
    if (!email.validity.valid) { 
      valids.className = "invalid"; 
      iconrequireds.classList.add("hide"); 
    } 
 
    if (!text.validity.valid) { 
      validt.className = "invalid"; 
      iconrequiredt.classList.add("hide"); 
    } 
 
    if (names.validity.valid || email.validity.valid || !email.hasAttribute('disabled') || text.validity.valid === false) { 
 
      iconrequiredt.classList.add("hide"); 
      iconrequireds.classList.add("hide"); 
      iconrequired.classList.add("hide"); 
    } 
 
  } 
 
} 
 
 
//ВАЛИДАЦИЯ ФОРМЫ 
forms.addEventListener('submit', validspace) 
 
function validspace() { 
 
  if (IsNullEmail() && IsNullName() && IsNullText() && validateform() === true) { 
 
    submitFormAjax(); 
    return false; 
 
  } else { 
 
    IsNullEmail(); 
    IsNullName(); 
    IsNullText(); 
    return false 
  } 
 
  return false 
} 
 
//ПУСТЫЕ ПОЛЯ 
function IsNullEmail() { 
 
  if (email.value.length === 0) { 
 
    iconrequireds.classList.remove("hide"); 
 
  } else { 
 
    iconrequireds.classList.add("hide"); 
 
    return true 
  } 
 
} 
 
function IsNullName() { 
 
  if (names.value.length === 0) { 
 
    iconrequired.classList.remove("hide"); 
 
 
  } else { 
 
    iconrequired.classList.add("hide"); 
 
    return true 
 
  } 
 
} 
 
function IsNullText() { 
 
  if (text.value.length === 0) { 
 
    iconrequiredt.classList.remove("hide"); 
 
  } else { 
 
 
    iconrequiredt.classList.add("hide"); 
 
    return true 
 
  } 
} 
 
//XMLHttpRequest 
function submitFormAjax() { 
 
  let captcha = grecaptcha.getResponse(); 
 
  if (captcha.length) { 
 
    let xmlhttp = window.XMLHttpRequest ? 
      new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 
 
    xmlhttp.onreadystatechange = function() { 
      if (this.readyState === 4 && this.status === 200) 
        alert(this.responseText); 
    } 
 
    let formData = new FormData(document.querySelector('#support')); 
    formData.append('g-recaptcha-response', captcha); 
 
    let data = new URLSearchParams(Array.from(formData)).toString(); 
 
    xmlhttp.open('POST', 'https://www.archsupport.ru/post-email.php', true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.send(data); 
  } 
 
  document.querySelector('#support').reset(); 
  grecaptcha.reset(); 
} 
 
// setATTR'S 
Element.prototype.setAttributes = function(attrs) { 
  for (var idx in attrs) { 
    if ((idx == 'styles' || idx == 'style') && typeof attrs[idx] == 'object') { 
      for (var prop in attrs[idx]) { 
        this.style[prop] = attrs[idx][prop] 
      } 
    } else { 
      this.setAttribute(idx, attrs[idx]); 
    } 
  } 
}; 
 
//CHANGE VALUE 
let radioChange = document.querySelectorAll(".radio"); 
 
for (var i = 0, len = radioChange.length; i < len; i++) { 
  radioChange[i].addEventListener('change', change); 
} 
 
function change() { 
 
  let input = document.getElementById("sellection"); 
 
  if (document.querySelector("#radio").checked === true) { 
    input.removeAttribute('disabled') 
    input.setAttributes({ 
      'type': 'email', 
      'placeholder': 'example@yourmail.ru', 
      'autocomplete': 'email', 
      'maxlength': '35', 
      'minlength': '12', 
      'pattern': '^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$', 
      'value': "" 
    }); 
  } else if (document.querySelector("#radio").checked == false) { 
 
    input.removeAttribute('disabled'); 
    input.setAttributes({ 
      'type': 'tel', 
      'placeholder': '+7-910-205-46-15', 
      'autocomplete': 'tel', 
      'maxlength': '36', 
      'minlength': '11', 
      'pattern': '\\+7\\s?[\\(]{0,1}9[0-9]{2}[\\)]{0,1}\\s?\\d{3}[-]{0,1}\\d{2}[-]{0,1}\\d{2}', 
      'value': "" 
    }); 
  } 
 
  input.value = ""; 
  input.focus(); 
}; 
 
 
//ICON ONCLICK 
function toggleItem(elem) { 
  for (var i = 0; i < elem.length; i++) { 
    elem[i].addEventListener("change", function(e) { 
      var current = this; 
      for (var i = 0; i < elem.length; i++) { 
        if (current != elem[i]) { 
          elem[i].classList.remove('checked'); 
        } else if (current.classList.contains('checked') === true) { 
          current.classList.remove('checked'); 
        } else { 
          current.classList.add('checked') 
        } 
      } 
      e.preventDefault(); 
    }); 
  }; 
} 
toggleItem(document.querySelectorAll('.icons'));
@keyframes req { 
  0% { 
    transform: translatex(0px); 
  } 
  100% { 
    transform: translatex(5px); 
  } 
} 
 
@keyframes inv { 
  0% { 
    opacity: .5; 
  } 
  100% { 
    opacity: 1; 
  } 
} 
 
@import url('https://fonts.googleapis.com/css?family=Raleway:100&display=swap'); 
* { 
  padding: 0; 
  margin: 0; 
  font-family: 'Raleway', sans-serif !important; 
  font-weight: 100 !important; 
  --lighter: #ededed; 
  --light: #d6d6d6; 
  --dark: #d7d7d7; 
  --dark1: gray; 
  --black: #343434; 
} 
 
form { 
  font-size: 24px; 
  position: relative; 
  width: 100%; 
  display: inline-flex; 
  flex-direction: column; 
} 
 
textarea { 
  height: 30vh; 
  border-radius: 18px; 
  padding-left: 15px; 
  padding-top: 10px; 
  border: 2px solid var(--dark); 
  overflow: hidden; 
  overflow-y: scroll; 
  outline: none; 
  resize: none 
} 
 
input, 
textarea { 
  font-size: 18px; 
} 
 
 ::-webkit-input-placeholder { 
  color: var(--dark1); 
  font-size: 18px; 
} 
 
 ::-moz-placeholder { 
  color: var(--dark1); 
  font-size: 18px; 
} 
 
 
/* Firefox 19+ */ 
 
 :-moz-placeholder { 
  color: var(--dark1); 
  font-size: 18px; 
} 
 
 
/* Firefox 18- */ 
 
 :-ms-input-placeholder { 
  color: var(--dark1); 
  font-size: 18px; 
} 
 
input:not([type="submit"]) { 
  border-radius: 100px; 
  padding-left: 15px; 
  height: 36px; 
  border: none; 
  background: var(--lighter); 
} 
 
input:focus { 
  outline: none; 
  border: 2px solid var(--dark); 
  box-sizing: border-box; 
  background: white; 
  padding-left: 13px; 
} 
 
.required { 
  display: inline-flex; 
  width: 100%; 
  flex-direction: column; 
  margin-bottom: 15px; 
  position: relative; 
} 
 
.iconrequired { 
  margin: auto; 
  display: flex; 
  align-items: center; 
  justify-content: center; 
  width: 90px; 
  height: 14px; 
  color: white; 
  border-radius: 100px; 
  font-size: 10px; 
  background: var(--black); 
  position: absolute; 
  right: 15px; 
  top: 10px; 
  opacity: 1; 
  transition: opacity ease-out 1s; 
  animation: .05s ease-in-out 0s 4 alternate req; 
} 
 
input:-webkit-autofill, 
input:-webkit-autofill:hover, 
input:-webkit-autofill:focus, 
input:-webkit-autofill:active { 
  transition: background-color 5000s ease-in-out 0s; 
  border: 2px solid #f3f3f3; 
  box-sizing: border-box; 
  padding-left: 13px; 
} 
 
div.button-set { 
  display: inline-flex; 
} 
 
div.button-set>label { 
  position: relative; 
  flex: 0 0 auto; 
  height: 50px; 
  width: 50px; 
  margin-left: 15px; 
  border-radius: 100px; 
  outline: none; 
  border: none; 
  margin-bottom: 20px; 
} 
 
.checked { 
  background: var(--dark); 
  border-radius: 100px; 
} 
 
input[type="submit"] { 
  height: 36px; 
  width: 160px; 
  font-size: 24px; 
  margin-top: 20px; 
  margin-left: 10px; 
  border: none; 
  border-radius: 100px; 
  background: #f3f3f3; 
  padding: 0; 
} 
 
 ::-webkit-scrollbar { 
  position: absolute; 
  z-index: 9999; 
  width: 5px; 
} 
 
 ::-webkit-scrollbar-button { 
  display: none; 
} 
 
 ::-webkit-scrollbar-track { 
  z-index: 9999; 
  background-color: transparent; 
} 
 
 ::-webkit-scrollbar-track-piece { 
  z-index: 9999; 
  z-index: 9999; 
  background-color: transparent; 
} 
 
 ::-webkit-scrollbar-thumb { 
  z-index: 9999; 
  background-color: #d7d7d7; 
  border-radius: 3px; 
} 
 
 ::-webkit-scrollbar-corner { 
  z-index: 9999; 
  background-color: #d7d7d7; 
} 
 
.invalid { 
  width: 12px; 
  height: 12px; 
  position: absolute; 
  right: 15px; 
  top: 12px; 
  background: tomato; 
  border-radius: 6px; 
  animation: 2s ease-in-out 0s infinite alternate inv; 
} 
 
.valid { 
  width: 12px; 
  height: 12px; 
  position: absolute; 
  right: 15px; 
  top: 12px; 
  background: #9dc46b; 
  border-radius: 6px; 
  animation: 2s ease-in-out 0s infinite alternate inv; 
} 
 
.error { 
  text-align: right; 
  font-size: 12px; 
  padding-right: 20px; 
  padding-top: 10px; 
  color: gray; 
  letter-spacing: .05em; 
} 
 
.hide { 
  display: none; 
} 
 
.g-recaptcha { 
  right: 0; 
  margin-top: 36px; 
}
<!DOCTYPE html> 
<html lang="ru"> 
 
<head> 
  <meta charset="utf-8"> 
 
  <script src='https://www.google.com/recaptcha/api.js' async defer></script> 
</head> 
 
<body> 
 
  <form id="support" onSubmit='return false' novalidate> 
   
    <label class="required"><span id="vs" class="invalid hide"></span><input id="sellection" class="mail sellection" name="sel" vlaue="" placeholder="выбери способ связи...."  required disabled><span id="error1"></span><div id="sellectionreq" class="iconrequired hide">ОБЯЗАТЕЛЬНО</div></label> 
     
    <div class="button-set"> 
     
      <label title="Email" class="icons"><img  src='https://drive.google.com/uc?export=view&id=12dgg88tY-Zv9YJSF3GGFKiBoccbcli7b'><input class="radio" id="radio" type="radio" name="button-set" value="на почту" style="display:none;"></label> 
       
      <label for="radio1" title="WhatsApp" class="icons"><img src='https://drive.google.com/uc?export=view&id=1SEtRXe081ekScf3q8RGR-AbCPIj-BfDM'><input class="radio" id="radio1" type="radio" name="button-set" value="в WhatsApp" style="display:none;"></label> 
       
      <label for="radio2" title="Telegram" class="icons"><img  src='https://drive.google.com/uc?export=view&id=1f_qsaD8vSG99IdKvWNm9xWiJ8h1wdjeM'><input class="radio" id="radio2" type="radio" name="button-set" value="в Telegram" style="display:none;"></label> 
       
      <label for="radio3" title="Viber" class="icons"><img  src='https://drive.google.com/uc?export=view&id=1Qq1htnz12ztZ1i5wPYOaXPLTWul_Vj3o'><input class="radio" id="radio3" type="radio" name="button-set" value="в Viber" style="display:none;"></label> 
       
    </div> 
     
    <label class="required"><span id="vn" class="invalid hide"></span> 
     
			<input id="name" class="mail" type="name" name="name" autocomplete= none value="" placeholder="как к тебе обращаться...."  pattern="[А-Яа-яЁё]+(\s+[А-Яа-яЁё]+)?" maxlength="15" minlength="2" required><div id="namereq" class="iconrequired hide">ОБЯЗАТЕЛЬНО</div></label> 
       
    <label class="required"><span id="vt" class="invalid hide"></span><textarea id="qestions" type="text" value="" placeholder="твой вопрос...." name="message"  pattern="[А-Яа-яЁё]+(\s+[А-Яа-яЁё]+)?" maxlength="400" minlength="40" required></textarea><div id="textreq" class="iconrequired hide">ОБЯЗАТЕЛЬНО</div></label> 
     
    <input name="submit" type="submit" id="submit" value="ОТПРАВИТЬ" /> 
     
  </form> 
  <div id="message"></div> 
  <div class="g-recaptcha" data-sitekey="6LceVswUAAAAAA09b8TVrZhKMFKOhxMmdvPWOzQm" data-size="visible"> 
  </div> 
</body> 
 
</html>

PHP:

header('Access-Control-Allow-Origin: *'); //предотвращает ошибку связанную с заголовком CORS «Access-Control-Allow-Origin»
$email = ($_POST['sel']); 
$change = ($_POST['button-set']);
$name = ($_POST['name']);
$question = ($_POST['message']);
$submit = ($_POST['submit']); 
$secret = '6xceVswUAxxxLgcxxzsssE4z1xxUjqDotYhbb'; //проверка reCAPTCHA
$ip         =$_SERVER['REMOTE_ADDR'];
$recaptcha  =$_POST['g-recaptcha-response'];
$google_url ="https://www.google.com/recaptcha/api/siteverify";
$url        =$google_url."?secret=".$secret."&response=".$recaptcha."&remoteip=".$ip;
$curl       =curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16");
$curlData   =curl_exec($curl);
curl_close($curl);
$res        =json_decode($curlData, true);
function clean($value = "") { //функция отчистки от лишних символов
    $value = trim($value);
    $value = stripslashes($value);
    $value = strip_tags($value);
    $value = htmlspecialchars($value);
    return $value;
}
$email = clean($email);
$change = clean($change);
$name = clean($name);
$question = clean($question);
function check_length($value = "", $min, $max) {//функция проверки длинны полей формы 
    $result = (mb_strlen($value) < $min || mb_strlen($value) > $max);
    return !$result;
}
if(!empty($email) && !empty($name) && !empty($question)) {
    if(check_length($email, 11, 36) && check_length($name, 2, 15) && check_length($question, 40, 400) && $res['success']) {//проверка длинны полей формы 

$counter_file = 'counter.txt'; //счетчик
clearstatcache();
ignore_user_abort(true); 
$fh = fopen($counter_file, 'r+b');
if ($fh)
{
if (flock($fh, LOCK_EX))
{
$count = fread($fh, filesize($counter_file));
rewind($fh);
$count++;
fwrite($fh, $count);
fflush($fh);
ftruncate($fh, ftell($fh));
flock($fh, LOCK_UN);
} fclose($fh);
} else 
ignore_user_abort(false); 
$to = 'support@archsupport.ru';   //отправка на email
$subject = 'Заявка №' . $count . ' с сайта archsupport.ru'; 
$message = 'Имя: ' . $name . "\r\n" . 'Контакты: ' . $email . "\r\n" . 'Написать ' . $change . "\r\n" . 'Вопрос: ' . $question  ; 
$headers = 'From: zergg52@gmail.com ' . "\r\n";
$subject = preg_replace("/(\r\n)|(\r)|(\n)/", "", $subject);
$subject = preg_replace("/(\t)/", " ", $subject);
$subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
@mail($to, $subject, $message, $headers);
echo 'сообщение отправлено!';
    } else { 
        echo "форма не была отправлена введенные данные некорректны";
    }
} else { 
    echo "форма не была отправлена заполните пустые поля";
}
?>
READ ALSO
Админ панель без CSS стилей

Админ панель без CSS стилей

Есть непонятная проблема с админ панелью WordPressЗагрузил сайт заказчику на хостинг, сам сайт работает корректно, CSS и JS, всё подгружает, но админ...

105
Как вывести json c русскими буквами

Как вывести json c русскими буквами

С самого начала я хотел из таблицы взять массив, который является json-массивом, но у меня не получилосьЯ попробовал вывести при json_encode массив...

145
gettext PHP не работает

gettext PHP не работает

Скачал пример с использованием gettext: https://githubcom/nota-ja/php-gettext-example Система: Debian 10 Локали настроены

106
Название DB с дефисом

Название DB с дефисом

Возможно ли создать базу данных с дефисом в названии? Если да, то как? Спасибо

99