Vextor-ltd
@Vextor-ltd
Webdeveloper

Почему в консоли вылетатет ошибка unexpected character at line 1 column 1 of the JSON data, когда поля формы не заполнены?

Когда все поля заполнены, то на клиент после отправки прилетает
Object { error: "", success: "Сообщение отправлено." }
. Всё как надо.
Но вот когда поля пустые, то в консоле вылетает ошибка:
Uncaught (in promise) SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Error: Promised response from onMessage listener went out of scope


А должно прилетать
Object { error: "Сообщение не отправлено. Форма заполнена некорректно.", success: "" }


Вот код:
// ОБРАБОТКА ОШИБОК, AJAX
  const form  = document.querySelector(".order-form");
  const formInputs = document.querySelectorAll(".order-form input");
  const url = "/php/send-order-form.php";

  // функция очистки
  function cleanForm() {
    //циклом проходимся по ним и обнуляем значение
    for (let item of formInputs) {
      item.value = "";
    }
  }

  // Функция отправки формы fetch
  async function postData(url, data = {}) {
    const response = await fetch(url, {
      method: "POST",
      body: data,
    });
    return await response.json();
  }

  // отправка
  // при отправке формы любым способом
  form.addEventListener("submit", function (e) {
    // запрещаем стандартное действие
    e.preventDefault();
    // создаем объект новый
    let data = new FormData(form);

    // передаем в фукцию fetch данные и получаем результат
    postData("/php/send-order-form.php", data).then((data) => {
      // обработка ответа от сервера
      console.log(data);
      if (data.error == "") {
        alert(data.success);
        cleanForm();
      } else {
        alert(data.error);
      }
    });
  });
};


<?php
/***   Получаем данные из формы отправленные скриптом ***/
// перед присвоением в переменную, проверяем есть ли данные
if (!empty($_POST["name"])) $name = $_POST['name'];
if (!empty($_POST["phone"])) $phone = $_POST['phone'];
if (!empty($_POST["message"])) $message = $_POST['message'];

/***   Проверка данных ***/
$OK = false;
if ($name and $phone and $message) $OK = true;

/***   Отправка данных ***/
if ($OK) {
    // отправка

    // если отправка успешна
    $result["error"] = "";
    $result["success"] = "Сообщение отправлено.";
} else {
    $result["error"] = "Сообщение не отправлено. Форма заполнена некорректно.";
}

/***   Возврат результата отправки ***/
header("Content-Type: application/json");
echo json_encode($result);
?>


С чем это связано?
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
С чем это связано?
С грязным стилем написания кода.

661c33f25f339728912163.png

Если задавить вывод ошибок, то код начнет работать.
!!!! НО !!!!!
661c35352405c300063421.png
Как быстро вы отловите ошибку с тем, что подчеркнуто красным ?
Ответ написан
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
1. Ошибки взаимодействия с сервером надо смотреть не в консольке, а во вкладке Сеть. Там в подвкладке Response или как она там в переводе называется, вы увидите ответ сервера.

2. Как правильно написал в комментариях ProjectSoft, проблема в том, что вы определяете переменные только при успешном прохождении проверки. Но если данных нет, то ни переменной $name, ни $phone, ни $message в коде не существует. И в итоге РНР вам законно выводит ошибку при попытке обратиться к этим переменным.
По итогам проверки переменная должна быть объявлена в любом случае. Это можно сделать либо с помощью конструкции else, либо как показано в примере ProjectSoft, с помощью тернарного оператора.
Переменную $OK можно определить как результат логического выражения, без всяких условий
$OK = $name and $phon and $message;
Но сама по себе она не имеет смысла. У вас результатом кода $name and $phon and $message УЖЕ является логическое выражение, которое вы УЖЕ можете подставить в условие. И зачем это делать с пересадкой - непонятно.

3. При этом надо понимать, что и isset, и empty в данном случае это подавление ошибок. И без нужды их лучше не применять. А просто написать
$name = $_POST['name'];
$phone = $_POST['phone'];
$message = $_POST['message'];

Тогда РНР сможет сообщить и об ошибках при составлении формы.

Но чтобы эти ошибки зря не лезли при запросе файла, лучше весь код целиком заключить в проверку типа
if ($_SERVER['REQUEST_METHOD'] === 'POST')

Как вариант - проверять каждую переменную на существование и пустоту отдельно, и выдавать соответствующие ошибки, типа "Поле name не отправлено", "Поле name не заполнено", и т.д.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы