Отправить PHP POST с помощью Javascript AJAX

Мои данные не вставляются в базу данных, я получаю пустой ответ из журнала консоли и сети. Я как бы потерял свой исходный код javascript, смешанный с другими ответами на переполнение стека, а также с моим кодом PHP.

<form id = "requestForm">
    <input type = "text" name = "fName" id = "name">
    <input type = "text" name = "fAddress" id = "address">
    <input type = "text" name = "fComment" id = "comment">

    <input type = "submit" value = "Submit" name = "nameSubmit">
</form>

<script>
        document.querySelector('#requestForm').addEventListener('submit', postRequest);

        function postRequest(e){
            e.preventDefault();

            const params = {

                fName: document.querySelector('#name').value,
                fAddress: document.querySelector('#address').value,
                fComment: document.querySelector('#comment').value,

            };
            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'addRequest.php', true);
            xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
            xhr.onload = function(){
                console.info(this.responseText);
            }
            xhr.send(params);
        } 
    </script>
</body>

Вот код PHP:

require_once 'Database.php';

var_dump($_POST); // returns `array(0) {}`

    if (isset($_POST['nameSubmit'])) {
var_dump($_POST); // shows no response    
        $r = $_POST['fName'];
        $o = $_POST['fAddress'];
        $p = $_POST['fComment'];

        $query = "INSERT INTO user_request(name, address, comment) VALUES(?,?,?)";
        $stmt = $db->prepare($query);
        $insert = $stmt->execute([$r, $o, $p]);

        if ($insert){
            echo 'Success';
        }else{
            echo 'Error';
        }
    }

Сначала вам нужно вызвать в prepare()

Rotimi 04.10.2018 14:24

Я думаю, что $_POST['nameSubmit'] не определен, потому что вы не отправляете его на сервер, и поэтому код внутри оператора if никогда не выполняется. Что возвращает var_dump($_POST)?

T K 04.10.2018 14:25

Может ли это быть проблемой с параметрами как const?

Cid 04.10.2018 14:25

Вы должны открыть отладчик браузера, сетевую панель и проверить, что происходит: проверьте, переданы ли параметры на страницу php, и проверьте результат на странице php

kiks73 04.10.2018 14:25

Нет определения параметров, поскольку const не является проблемой. Проблема в том, что TK говорит, что на сервер не передается переменная nameSubmit. Скорее всего, код php был взят из примера отправки формы, где кнопка отправки имела имя «nameSubmit».

scrappedcola 04.10.2018 14:27
var_dump($_POST) возвращает array(0) {}
thisisnotwakanda 04.10.2018 14:29

Где вы поставили эту строчку? Отредактируйте свой вопрос, используя то, что вы пробовали, и результат var_dump(), который вы можете написать в качестве комментария в своем коде.

MrUpsidown 04.10.2018 14:31

Ставлю перед строкой if (isset) .. и когда ставлю после if (isset), ответа не показывает. Обновлено: отредактировать мой ответ в части PHP

thisisnotwakanda 04.10.2018 14:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
8
3 074
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я считаю, что пост-параметр nameSubmit не существует. Используйте функцию var_dump() для дампа всех $_POST
С моей точки зрения, единственным указанным параметром было

  • fName
  • fAddress
  • fКомментарий

Почему бы вместо этого не проверить метод запроса?
Это лучше, чем проверять, существует ли переменная или нет. Вы можете выполнить проверку необходимого параметра позже, когда убедитесь, что это запрос POST.

if ($_SERVER['REQUEST_METHOD'] === 'POST'){
    // Do whatever you want when POST request came in
}

ОБНОВЛЕНИЕ:
Вот ответ, который вы хотели!

<form id = "requestForm">
    <input type = "text" name = "fName" id = "name">
    <input type = "text" name = "fAddress" id = "address">
    <input type = "text" name = "fComment" id = "comment">

    <button onclick = "sendData();" type = "button">Submit</button>
</form>

<div id = "testdiv"></div>

    <script>

      function sendData(){
          var data = new FormData();
          data.append('fName', document.getElementById("name").value);
          data.append('fAddress', document.getElementById("address").value);
          data.append('fComment', document.getElementById("comment").value);

          var xhr = new XMLHttpRequest();
          xhr.open('POST', 'test.php', true);
          xhr.onload = function () {
            if (xhr.status !== 200){
              // Server does not return HTTP 200 (OK) response.
              // Whatever you wanted to do when server responded with another code than 200 (OK)
              return; // return is important because the code below is NOT executed if the response is other than HTTP 200 (OK)
            }
            // Whatever you wanted to do when server responded with HTTP 200 (OK)
            // I've added a DIV with id of testdiv to show the result there
            document.getElementById("testdiv").innerHTML = this.responseText;
          };
          xhr.send(data);
      }

    </script>
</body>

Код PHP:

<?php

if ($_SERVER['REQUEST_METHOD'] === 'POST'){
    var_dump($_POST);
}else{
    header('HTTP/1.0 403 Forbidden');
}

?>

Чтобы добавить еще одно поле, добавьте еще одну функцию data.append под data var.
На кнопку отправки ДОЛЖНЫ БЫТЬ НАЖАТЫ. Чтобы разрешить использование ввода, добавьте для него прослушиватель событий! .
Как это выглядит на моей стороне: https://image.ibb.co/gfSHZK/image.png
Надеюсь, это именно тот ответ, который вам нужен.

Просим разъяснений: почему это отклонено? ?

PlanetCloud 04.10.2018 14:34

Я получаю сообщение об ошибке в PHP: Undefined index: fName, Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null in C:\xampp\htdocs и еще один C:\xampp\htdocs\: PDOStatement->execute(Array).

thisisnotwakanda 04.10.2018 14:43

Привет, Вы пробовали сделать var_dump() на $_POST, как я упоминал выше?

PlanetCloud 05.10.2018 06:59

@thisisnotwakanda, извините за мой предыдущий ответ. Я протестировал ваш код с помощью var_dump, и он возвращает пустой массив ... Пожалуйста, проверьте мой обновленный ответ, так как это определенно то, что вы ищете. (Проверено на localhost с PHP 7.1).

PlanetCloud 05.10.2018 07:23

@thisisnotwakanda Просить разъяснений: Решена ли эта проблема?

PlanetCloud 05.10.2018 15:40

@thisisnotwakanda Рад это слышать :), пожалуйста, проголосуйте за ответы, спасибо.

PlanetCloud 07.10.2018 14:27

Две проблемы:

1.) Params не отправляются должным образом / вообще из-за отсутствия сериализация. Когда вы используете тип содержимого формы, ваш объект params должен быть в определенном формате name=value&name2=value2. Итак, чтобы облегчить это, вам нужно преобразовать свой объект, используя что-то вроде:

function getReadyToSend(object) {
    var objList = [];
    for (var prop in object) {
        if (object.hasOwnProperty(prop)) {
            objList.push(encodeURI(prop + '=' + object[prop]));
        }
    }
    return objList.join("&");
}

Итак, ваша отправка становится: xhr.send(getReadyToSend(params));

2) Ваш php ожидает отправки кнопки отправки. if (isset($_POST['nameSubmit'])) { У вас нет отправляемой переменной с именем nameSubmit, вы можете исправить это, включив ее или проверив, что каждая переменная установлена ​​вместо нее. Я бы посоветовал последний способ обработать ошибку, если 1 или более не переданы.

Предложение: обновите загрузку, чтобы проверить статус:

if (xhr.status === 200)
{
    console.info(xhr.responseText);
}
else if (xhr.status !== 200)
{
    console.info('Request failed.  Returned status of ', xhr.status);
}

Пример скрипки: http://jsfiddle.net/qofrhemp/1/, откройте вкладку сети и проверьте вызов, теперь вы увидите параметры в данных формы для вызова, который запускается при нажатии кнопки submit.

Разве я не включил nameSubmit, когда ставил вот так? <input type = "submit" value = "Submit" name = "nameSubmit">. Спасибо за ваш вклад, сэр, ваше решение кажется мне продвинутым, но пока я приму ответ @ PlanetCloud и обязательно попробую ваше решение позже.

thisisnotwakanda 06.10.2018 17:15

Вы выполняете вызов ajax, а не отправку формы. Это не в вашем списке параметров, который вы явно отправляете на сервер.

scrappedcola 07.10.2018 00:35

Другие вопросы по теме