Задать вопрос
@Yarilo-Vitaly

Почему FormData не отправляет данные?

Здравствуйте. В сотый раз проверяю код и не могу понять. Почему не работает FormData.
При правильной работе в console.log() и Network должен появляться объект с данными из формы.
А его нет. Думаю что по этой же причине не приходят данные в phpMyAdmin. Для работы я использую Open Server. Если перейти по ссылки, то можно увидеть всё своими глазами.

<form action="#" id="form_test" class="test_form">
            <input id="name_form"  class="input_test_form" name="name" type="name" required 
                  placeholder="Ваше имя" value="">
            <input id="phone_form" class="input_test_form" name="phone" type="tel" required 
               placeholder="Номер телефона" value="">
            <button type="submit" class="test_button"> Отправить</button>
        </form>


const formTest = document.getElementById('form_test'),
  InputTestFor = document.querySelectorAll('.input_test_form');

function sendForm(f) {
  f.addEventListener('submit', (event) => {
    event.preventDefault();
    let dataForm = new FormData(f);
       function postData(d) {
      return new Promise((resolve, reject) => {
        let request = new XMLHttpRequest();
        request.open('POST', '/connection.php');
        request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
         request.onreadystatechange = function () {
          if (request.readyState < 4) {
            resolve();
          } else if (request.readyState === 4) {
            if (request.status == 200 && request.status < 300) {
             resolve();
            } else { reject(); }
          }
        };
        request.send(d);
        console.log(dataForm);
      });
    }
     function clearInput() {
      for (let i = 0; i < InputTestFor.length; i++) {
        InputTestFor[i].value = '';
      }
    }
    postData(dataForm)
      .then(() => { console.log('загрузка');})
      .then(() => { console.log('отправлено'); })
      .catch(() => { console.log('ошибка');})
      .then(clearInput);
  });
}
sendForm(formTest);


<?php
header("Access-Control-Allow-Origin: *"); 
$phone = $_POST["phone"];

$host = 'localhost'; // адрес сервера 
$database = 'yoga_tours'; // имя базы данных
$user = 'root'; // имя пользователя
$password = ''; // пароль
 
// подключаемся к серверу
$link = mysqli_connect($host, $user, $password, $database) 
    or die("Ошибка " . mysqli_error($link));

$sql = "INSERT INTO phones (id, phone) VALUES (NULL, '$phone')";
$result = mysqli_query($link, $sql) or die("Ошибка " . mysqli_error($link)); 

if($result)
{
    echo "Выполнение запроса прошло";
    echo $_POST['phone'];
}
 
// закрываем подключение
mysqli_close($link);
?>
  • Вопрос задан
  • 731 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
@galaxy
А вот это на кой ляд:
request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');

??

Warning: When using FormData to submit POST requests using XMLHttpRequest or the Fetch_API with the multipart/form-data Content-Type (e.g. when uploading Files and Blobs to the server), do not explicitly set the Content-Type header on the request. Doing so will prevent the browser from being able to set the Content-Type header with the boundary expression it will use to delimit form fields in the request body.

https://developer.mozilla.org/en-US/docs/Web/API/F...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
0) Проверить консоль браузера на ошибки, исправить.
1) Включить вывод ошибок в пхп.
2) проверить что ваш скрипт вообще что-то отправляет во вкладке нетворк (и что отправляет то что надо и куда надо)
3) так же в нетворк смотреть что пришло из ответа на запрос аяксом, если ошибка - исправлять

вроде все

PS:
$phone = $_POST["phone"]; может стоить проверить что вообще прислали?

$result = mysqli_query($link, $sql) or die("Ошибка " . mysqli_error($link));
дыра с инъекцией
if (request.status == 200 && request.status < 300) {...
ваще шедевр ))
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы