Получение данных, отправленных с помощью Ajax из php? - PullRequest
0 голосов
/ 20 мая 2019

извините, если об этом спрашивали много раз, но я не могу заставить его работать. Я пытаюсь создать спокойный сайт, у меня есть простая форма:

<form action="/my/path" method="post" id="myformid">
Name <input type="text" name="name">
<input type="submit" value="Test">
</form>

Я конвертирую данные, введенные пользователем, используя Javascript, и отправляю их в свой php-файл, используя Ajax:

function postData() {
    $('#myformid').on('submit', function(event) {
        event.preventDefault();
        const json = JSON.stringify($("#myformid").serializeArray());
        $.ajax({
            type: "POST",
            url: "/my/path",
            data: json,
            success: function(){},
            dataType: "json",
            contentType : "application/json"
        });
    });
}

И я попытался прочитать данные на php, как:

$data = json_decode(file_get_contents('php://input'), true);
$name = $data["name"];

Код работает отлично, если я отправляю JSON в теле запроса, используя такой инструмент, как Postman, но из того, что я тестировал с помощью Ajax, данные json поступают как данные POST, и я могу прочитать их, используя $ _POST ["name"] , но не с 'php: // input', как я сделал.

Как я могу это исправить, чтобы JSON был принят даже через Javascript?

Ответы [ 4 ]

0 голосов
/ 21 мая 2019

Привет, ты можешь попробовать вот так:

Сначала я использую атрибут id для каждого ввода, который мне не очень нравится сериализовать, но это то, что вы можете сделать это по-своему, вот файлы. ваш index.php:

 <form method="post" id="myformid">
  Name :<input type="text" id="name" name="name">
  <input type="submit"  value="Test">
  </form>
  <br>
  <div id="myDiv">
  </div>

Ваш JavaScript:

  //ajax function return a deferred object
    function _ajax(action,data){
      return $.ajax({
        url: 'request.php',
        type: 'POST',
        dataType: 'JSON',
        data: {action: action, data: data}
      })
    }
    //your form submit event
    $("#myformid").on('submit', function(event) {
      //prevent post
      event.preventDefault();
      //validate that name is not empty
      if ($("name").val() != "") {
        //parameters INS is insert data is the array of data yous end to the server
        var action = 'INS';
        var data = {
          name: $("#name").val()
        };
        console.log(data);
        //run the function and done handle the function
        _ajax(action,data)
        .done(function(response){
          console.log(response);
          //anppend name to the div
          $("#myDiv").append("<p>"+response.name+"</p>");
        });
      }
    });

Ваш файл request.php:

<?php
//includes and session  start here
//validate that request parameters are set
if (isset($_POST["action"]) && isset($_POST["data"])) {
  //getters
$action = $_POST["action"];
$data = $_POST["data"];
//switch to handle the action to perfom maybe you want to update with the form too ?
switch ($action) {
  case 'INS':
    // database insert  here..
    //return a json object
    echo json_encode(array("name"=>$data["name"]));
    break;
}
}
 ?>

Результаты:

enter image description here

Надеюсь, это поможет =)

0 голосов
/ 20 мая 2019

Из документации из .serializeArray().

Метод .serializeArray () создает массив объектов JavaScript, готовых для кодирования в виде строки JSON.

И в примере, приведенном на той же странице, ясно, что вы получите массив в php, чтобы получить доступ к элементу, вы должны попробовать-

`$data[0]['name']`

Кроме того, вы пробовали print_r ($ data), это NULL ??

0 голосов
/ 20 мая 2019

Измените ваши коды ajax

$('#btnSubmit').on('click', function(event) {
    event.preventDefault();
    $.ajax({
        type: "POST",
        url: "/new.php",
        data: $("#myformid").serialize(),
        dataType: "json",
        success: function(response) {
            console.log(response);
        }
    });
});

Также вам нужно внести некоторые изменения в форму

<form action="new.php" method="post" id="myformid">
Name <input type="text" name="name">
<input id="btnSubmit" type="button" value="Test">

И вы можете получить POST-данные в php-файле, например $_POST['name']

0 голосов
/ 20 мая 2019

Вы можете установить непосредственную сериализацию в запросе ajax для отправки параметров

function postData() {
    $('#myformid').on('submit', function(event) {
        event.preventDefault();

        $.ajax({
            type: "POST",
            url: "/my/path",
            data: $("#myformid").serialize(),
            success: function(){},
            dataType: "json",
            contentType : "application/json"
        });
    });
}

И вы можете получить POST в своем PHP, используя $ _ POST

print_r($_POST);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...