- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Всем привет! Делаю обработку формы с помощью AJAX, при отправке формы я получаю следующую ошибку из JS дебага: {"readyState":4,"responseText":"","status":200,"statusText":"parsererror"}
Спустя часы сёрфинга гугла и stackoverflow, я так и не нашёл решения своей проблемы, но пришёл к выводу, что ошибка на стороне PHP обработчика. Буду благодарен за любую помощь связанную с данной темой, потому что уже всю голову сломал и не очень понимаю в чём проблема ;(
К этому выводу я пришёл потому что если в методе success в AJAX-запросе указывать data, и если смотреть вкладку Network там всё нормально вроде как..
PHP-код:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('PHPMailer/Exception.php'); require_once('PHPMailer/PHPMailer.php'); require_once('PHPMailer/SMTP.php'); if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') { exit(); } if ($_SERVER['REQUESTED_METHOD'] != 'POST') { exit(); } if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['name']) && isset($_POST['message'])) { function secure_input($data) { $data = trim($data); $data = filter_var($data, FILTER_SANITIZE_STRING); $data = str_replace(array("\r", "\n"), array(" ", " "), $data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } $name = secure_input($_POST["name"]); $message = secure_input($_POST["message"]); if(!empty($_FILES['attachment'])) { $file_name = $_FILES['attachment']['name']; $file_tmp_name = $_FILES['attachment']['tmp_name']; $file_size = $_FILES['attachment']['size']; if($file_size < '2048000') { $file_path = move_uploaded_file($file_tmp_name, $file_name); }else{ print json_encode(['error'=>1,'msg'=>"Oops! File upload size exceeded...", $file_size]); exit; } } $mail = new PHPMailer(true); $mail->CharSet = 'UTF-8'; $mail->IsSMTP(); $mail->SMTPDebug = 4; $mail->SMTPAuth = TRUE; $mail->SMTPSecure = "ssl"; $mail->Port = 465; $mail->Username = "smtp.user"; $mail->Password = "smt.pass"; $mail->Host = "smtp.domain.com"; $mail->Mailer = "smtp"; $mail->SetFrom("email@domain.com"); $mail->AddReplyTo($_POST["email"]); $mail->AddAddress("my@gmail.com"); $mail->IsHTML(true); $mail->Subject = ("MyForm Subject"); $mail->Body = " <h1>Hello dear admin!</h1> <p>I am your personal mail delivery robot.</p> <b>I have something new for you submitted from the form myForm</b> Message: <p>$message</p> "; $mail->WordWrap = 80; $mail->MsgHTML($_POST["message"]); if (is_array($_FILES['attachment'])) { $mail->AddAttachment($file_tmp_name, $file_name); } if (!$mail->send()) { $message = 'Error'; }else{ $message = 'Email sent successfully'; } } $response = ['message' => $message]; header('Content-type: application/json'); echo json_encode($response);jQuery-код:
$(document).ready(function() { $("#submitMyForm").click(function(e) { e.preventDefault(); jQuery.validator.addMethod("validDate", function(value, element) { return this.optional(element) || moment(value, "MM/DD/YY").isValid(); }, "Please enter a valid date in the format MM/DD/YY"); jQuery.validator.addMethod("phoneTest", function(value, element) { if (/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/.test(value)) { return true; } else { return false; }; }, "Invalid phone number"); $("#myForm").validate({ rules: { scheduleAudience: { required: true, }, date: { required: true, validDate: true }, time: { required: true }, fName: { required: true, lettersonly: true, minlength: 2, maxlength: 30 }, lName: { required: true, lettersonly: true, minlength: 2, maxlength: 30 }, email: { required: true, email: true }, phone: { required: true, phoneTest: true }, preferences: { required: true }, message: { required: true, minlength: 20, maxlength: 500 }, messages: { fName: { minlength: "Please, provide information with minimum - 2 Characters", maxlength: "Please, provide information with maximum - 30 Characters" }, lName: { minlength: "Please, provide information with minimum - 2 Characters", maxlength: "Please, provide information with maximum - 30 Characters" }, message: { minlength: "Please, provide information with minimum - 20 Characters", maxlength: "Please, provide information with maximum - 500 Characters" } }, } }); if ((!$('#myForm').valid())) { return false; } if (($('#myForm').valid())) { var formData = $("#myForm").serialize(); var URL = $("#myForm").attr("action"); $.ajax({ url: URL, type: "POST", data: formData, cache: false, processData: false, contentType: false, success: function(data) { alert(JSON.stringify(response)); if (response.status == 1) { swal({ title: "Good job!", text: "We will get in touch with you soon", icon: "success", }); } }, error: function(response) { alert(JSON.stringify(response)); } }); } }) $("#attachment").change(function() { var file = this.files[0]; var fileType = file.type; var match = ['image/jpeg', 'image/jpg', 'image/png']; if (!((fileType == match[0]) || (fileType == match[1]) || (fileType == match[2]))) { swal({ title: "Invalid file format", text: "Sorry, only JPEG, JPG and PNG files are allowed to upload!", icon: "error", }); $("#attachment").val(''); return false; } }); });HTML-форма (инпуты name совпадают 100%, во вкладке Network информация в Payload/FormData есть).
<form class="contact100-form validate-form" id="myForm" name="myForm" action="URL_TO_PHPSCRIPT" method="post">SMTP-данные 100% корректные, если я использую например форму отсюда https://phppot.com/jquery/jquery-contact-form-with-attachment-using-php/ письма отправляются, а в моём коде видимо какая-то проблема.
Валидация на стороне клиента работает без проблем.
Благодарю всех за внимание и буду очень благодарен за любую помощь и подсказки.
P.S. , я сократил количество переменных в PHP коде, чтобы было удобнее читать код, с переменными и их name точно проблем нет, перепроверял и не раз.
Гляньте в инструментах разработчика браузера (вкладка Network), что уходит/приходит
В Preview "Nothing to preview"
В Response "This request has no response data available"
Request payload скриншот прикрепил ниже(данные из всех инпутов перечисляются через &),
Status code: 200 / Request Method: POST
dataType: 'json',
А также проверить в PHP файл, случаем не в UTF-8 с BOM сохранён.
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') { exit(); } if ($_SERVER['REQUESTED_METHOD'] != 'POST') { exit(); } if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['name']) && isset($_POST['message'])) {Какая-то бессмысленная проверка второй раз на POST
Пробуйте указать в JS
dataType: 'json',
А также проверить в PHP файл, случаем не в UTF-8 с BOM сохранён.
Попробовал, вообще ничего не изменилось.
С кодировкой файла всё хорошо.
Какая-то бессмысленная проверка второй раз на POST
Да, согласен.
ну тогда нужно всё это выкладывать на сайт и давать ссылки, что там происходит
В Response "This request has no response data available"
Значит ваш сервер отработал какой-то exit();
Перед ними вставьте вывод хоть какой-то информации. exit('error POST'); и т.д. То это тихомолка какая-то.
Какая-то бессмысленная проверка второй раз на POST
Да и переменная какая-то странная:
ну тогда нужно всё это выкладывать на сайт и давать ссылки, что там происходит
Значит ваш сервер отработал какой-то exit();
Перед ними вставьте вывод хоть какой-то информации. exit('error POST'); и т.д. То это тихомолка какая-то.
Мистика, после добавления в первую проверку exit('Текст');
Ссылка -> https://bit.ly/3vzJWbO
Надеюсь не нарушаю правила форума использую shorten url
Теперь же я получаю Response
{"message":null}Первая строчка в файле должна быть:
header('Content-type: application/json');Далее уже выводите в JSON формате ошибки.