Как объединить форму с обработчиком?

Автор Sorokin Vladimir, 28-06-2018, 19:40:08

« назад - далее »

Sorokin VladimirTopic starter

Есть почтовая форма «myform.php» и к ней обработчик «contacts.php».
Мне нужно из двух файлов сделать один «myform.php», совмещающий форму и обработчик.

Подобную процедуру делал неоднократно, и все работало отлично!
Но в этот раз что то не задалось....  Упoрно не работает!

Мои действия  =  содержимое файла «contacts.php»
[spoiler]<?php
if (isset ($_POST['contactFF'])) {
   $spam = trim($_POST['check']);
   $spammsg = trim($_POST['message']);
   if ($spam == 'stopSpam' && $spammsg == '') /* Проверка на спам  */
{
  $to = "хxх@mail.ru"; // поменять на свой электронный адрес
  $from = $_POST['contactFF'];
  $subject = "Письмо с блога";
  $sender = "хxх@domain.kz";  // поменять на электронный адрес с которого сервер отправляет почту
  $message = "Имя: ".$_POST['nameFF']."\nEmail: ".$from."\nIP: ".$_SERVER['REMOTE_ADDR']."\nСообщение: ".$_POST['messageFF'];
  $boundary = md5(date('r', time()));
  $filesize = '';
  $headers = "MIME-Version: 1.0\r\n";
  $headers .= "From: " . $sender . "\r\n";
  $headers .= "Reply-To: " . $from . "\r\n";
  $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
  $message="
Content-Type: multipart/mixed; boundary=\"$boundary\"

--$boundary
Content-Type: text/plain; charset=\"utf-8\"
Content-Transfer-Encoding: 7bit

$message";
  for($i=0;$i<count($_FILES['fileFF']['name']);$i++) {
     if(is_uploaded_file($_FILES['fileFF']['tmp_name'][$i])) {
         $attachment = chunk_split(base64_encode(file_get_contents($_FILES['fileFF']['tmp_name'][$i])));
         $filename = $_FILES['fileFF']['name'][$i];
         $filetype = $_FILES['fileFF']['type'][$i];
         $filesize += $_FILES['fileFF']['size'][$i];
         $message.="

--$boundary
Content-Type: \"$filetype\"; name=\"$filename\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=\"$filename\"

$attachment";
     }
   }
   $message.="
--$boundary--";

  if ($filesize < 10000000) { // проверка на общий размер всех файлов. Многие почтовые сервисы не принимают вложения больше 10 МБ
    mail($to, $subject, $message, $headers);
    echo $_POST['nameFF'].', Ваше письмо отправлено, спасибо!';
  } else {
    echo 'Извините, письмо не отправлено. Размер всех файлов превышает 10 МБ.';
  }
} else { echo 'Ошибка, письмо не отправлено.'; }
   
}
?>[/spoiler]
скопировал и поместил в файл «myform.php», перед кодом самой формы
[spoiler]<form id="feedback-form" action="contacts.php" enctype="multipart/form-data" method="post">
<h2>Письмо автору</h2>
<input id="nameFF" class="w100 border" name="nameFF" required="" type="text" placeholder="Ваше имя" />
<input id="contactFF" class="w100 border" name="contactFF" required="" type="text" placeholder="Ваш email" />
<input id="fileFF" class="w100" multiple="multiple" name="fileFF[]" type="file" />
<textarea id="messageFF" class="w100 border" name="messageFF" required="" rows="5" placeholder="Ваше сообщение"></textarea>
<div class="w0"><textarea id="message" class="w100 border" name="message" rows="5"></textarea>
<input id="check" name="check" type="text" value="" /></div>
<input id="submitFF" type="submit" value="Отправить" onClick="document.getElementById('check').value = 'stopSpam';" /></form>
<script>
document.getElementById('feedback-form').addEventListener('submit', function(evt){
  var http = new XMLHttpRequest(), f = this;
  evt.preventDefault();
  http.open("POST", "contacts.php", true);
  http.onreadystatechange = function() {
    if (http.readyState == 4 && http.status == 200) {
      alert(http.responseText);
      if (http.responseText.indexOf(f.nameFF.value) == 0) { // очистить поле сообщения, если в ответе первым словом будет имя отправителя
        f.messageFF.removeAttribute('value');
        f.messageFF.value='';
      }
    }
  }
  http.onerror = function() {
    alert('Извините, данные не были переданы');
  }
  http.send(new FormData(f));
}, false);
</script>
[/spoiler]
в самой форме удалил ссылку на файл обработчика, то есть вместо «action="contacts.php"» написал «action=""», а в скрипте формы, вместо «http.open("POST", "contacts.php", true);» соответственно «http.open("POST", "", true);».
Метод проверенный и до сего момента сбоев не было.
Может, кто сталкивался с подобными заморочками, подскажите, плизззз, где я что упускаю. Спасибо!
Мой девиз:    Делу время, потехе – час!
Натяжка HTML шаблонов на MODX Rev, Joomla 3, GetSimpleCMS, MyEngineCMS,  Kandidat CMS.
  •  


Coder

Навскидку - у вас аякс что открывает - пустое значение?

Да и вообще - зачем он вам нужен в одной странице? Он именно используется для фонового запроса к стороннему ресурсу.

Нужно переписать на без него - через jquery или просто js.

Хотя стоит оставить в двух файлах - это правильно со всех сторон.



Sorokin VladimirTopic starter

Цитата: Coder от 28-06-2018, 21:18:19Хотя стоит оставить в двух файлах - это правильно со всех сторон.
У меня есть форма обратной связи, поверенная годами, стоит на двух моих сайтах, и я стараюсь её ставить на все свои шаблоны.
Её ценность именно в том, что всё в одном файле  =  форма, обработчик, стили и тд. Когда надо её внедрить, просто вставляю в нужное место содержимое одного файла.
А форма, что я сейчас показываю меня заинтересовала тем, что у неё защита от спама не просто капча, а невидимое поле.
Меня самого бывает напрягает, когда надо вставлять цифры, буквы или кучу картинок отмечать.....


Мой девиз:    Делу время, потехе – час!
Натяжка HTML шаблонов на MODX Rev, Joomla 3, GetSimpleCMS, MyEngineCMS,  Kandidat CMS.
  •  

ProtectYourSite

Ага, только в вашей проверенной форме нету никакой фильтрации, взламывать тут потом будет на раз плюнуть.

Sorokin VladimirTopic starter

Цитата: ProtectYourSite от 18-07-2018, 11:34:08
Ага, только в вашей проверенной форме нету никакой фильтрации, взламывать тут потом будет на раз плюнуть.
по большому счету, в природе не существует "невзламываемых" форм......
Мой девиз:    Делу время, потехе – час!
Натяжка HTML шаблонов на MODX Rev, Joomla 3, GetSimpleCMS, MyEngineCMS,  Kandidat CMS.
  •  


ProtectYourSite

Цитата: Sorokin Vladimir от 18-07-2018, 12:32:55
по большому счету, в природе не существует "невзламываемых" форм......
Речь не про спам, а про уязвимости типо RCE, XSS, SQL Inject - в десятке строчек кода от этого не так сложно избавиться.