Почему PHP не может получить данные $ _POST из выборки Js FormData? - PullRequest
0 голосов
/ 22 апреля 2019

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

Моя идея заключается в использовании fetch для отправки FormData (которая содержит входные данные с JSON в качестве значения) в PHP.На стороне сервера PHP позаботится о форме с $_POST и вернет мне строку JSON.

Я использую бесплатный хост-сервис с PHP 7.0 для тестирования.

Весь приведенный ниже код находится в одном и том же файле (404.php):

var now = new Date();

var pkg = JSON.stringify({
    ts: now.getTime(),
    tz: now.getTimezoneOffset() / -60
})

var form = new FormData();
form.set('json', pkg);

console.log(form.has('json')) // true
console.log(form.values().next()) // return and obj contain JSON string

fetch('/404.php', {
    method: 'POST',
    body: form
});
$json = null;
if(isset($_POST['json'])) $json = json_decode($_POST['json']);

var_dump($_POST); //Result: array(0) { }

Как видите, выходные данные var_dump представляют собой пустой массив.Но то, что я ожидаю увидеть, это вывод со строкой JSON.

Я пробовал другой способ, а именно этот fetch-api-json-php , но он также бесполезен,Все ресурсы, которые я нашел в Интернете, обычно о классическом AJAX, а не о API извлечения.И большинство из них только для клиентской стороны, я не могу найти ничего для PHP / серверной стороны.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Можете ли вы попробовать запустить этот код на локальном компьютере?

Создайте имя файла 55788817.php, вставьте этот код и запустите.

  <?php
  if (isset($_POST) && !empty($_POST)) {
    $json = null;
    if(isset($_POST['json'])) $json = json_decode($_POST['json']);

    var_dump($_POST); //Result: array(1) { ["json"]=> string(29) "{"ts":1555915560755,"tz":5.5}" }
    exit;
  }
  ?>
  <!DOCTYPE html>
  <html>
  <head>
    <title></title>
  </head>
  <body>
    <button type="button" id="registerButton">Click Me!</button>
    <script>
      var now = new Date();

      var pkg = JSON.stringify({
          ts: now.getTime(),
          tz: now.getTimezoneOffset() / -60
      })

      var form = new FormData();
      form.append('json', pkg);

      console.log(form.has('json')) // true
      console.log(form.values().next()) // return and obj contain JSON string
      fetch('./55788817.php', {
          method: 'POST',
          body: form
      });
    </script>
  </body>
  </html>
0 голосов
/ 22 апреля 2019

Это сработало для меня:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<script>
    var pkg = '{"test":"data"}';
    var formData = new FormData();
    formData.set('json', pkg);

    fetch('./404.php', {
      method: 'POST',
      body: formData
    });
</script>
</head>
<body>

</body>
</html>

PHP:

<?php
$json = null;
if(isset($_POST['json'])) 
    $json = json_decode($_POST['json']);

var_dump($_POST, $json); 

// Result: array(1) { ["json"]=> string(15) "{"test":"data"}" } object(stdClass)#1 (1) { ["test"]=> string(4) "data" } 

?>
...