当前位置: 首页 > 知识库问答 >
问题:

为什么PHP不能从Js FormData获取$_POST数据?

武友樵
2023-03-14

我想将JSON数据(在本例中是客户端时间戳)发送到我的服务器。然而,我的代码似乎没有像我期望的那样工作。

我的想法是使用fetch将FormData(包含以JSON为值的输入)发送到PHP。在服务器端,PHP将使用$_post处理表单,并将JSON字符串返回给我。

我正在使用一个免费的主机服务,它有PHP7.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,但也没用。我在Internet上找到的所有资源通常都是关于经典的AJAX的,而不是关于fetch API的。而且大多数都是针对客户端的,对于PHP/服务器端我找不到太多。

共有2个答案

归俊捷
2023-03-14

这对我很管用:

<!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" } 

?>
孔磊
2023-03-14

您能尝试在您的本地计算机中运行此代码吗?

制作一个文件名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>
 类似资料:
  • 问题内容: 当我的PHP脚本从AJAX POST请求接收数据时,变量将被转义。真正奇怪的是,这仅发生在我的生产服务器上(在Linux上运行PHP 5.2.12),而不在我的本地服务器(在Windows上运行PHP 5.3.1)上发生。 这是AJAX代码: 这有什么原因吗?以及如何解决此问题,使其在两台服务器上均可工作? 编辑:我具有magic_quotes的以下设置: 问题答案: 您可能已在Lin

  • 问题内容: 当我的PHP脚本从AJAX POST请求接收数据时,将对变量进行转义。真正奇怪的是,这仅发生在我的生产服务器(在Linux上运行PHP 5.2.12)上,而不在我的本地服务器(在Windows上运行PHP 5.3.1)上发生。 这是AJAX代码: 这有什么原因吗?我应该如何解决这个问题,使其在两台服务器上都能正常工作? 编辑:我对magic_quotes具有以下设置: 问题答案: 您可

  • 问题内容: 我有1个表单,里面有多个复选框(每个都有代码): 数据库中的主键在哪里- 因此每个值都不同。 我如何知道已经选中了哪些复选框?(也许多个) 这是针对收件箱系统的,我下面有一个按钮,我希望(单击时)删除选中了复选框的所有消息(标识:)。 问题答案: 在表单中将名称设置为,您将能够以array()的形式访问所有复选框。 以下是根据要求提供的一些示例:

  • 我正在尝试将数据从DialogFraank发送到创建此对话框的Fraank。在目标片段中,我使用以下代码: 我还在fragment实现了我的接口: 在DialogFragment中,我使用以下代码: 并发送数据: 我还试图从这个问题中使用onActivityResult(): 接收数据: 但我没有收到数据:(((

  • 由于找不到文件,send方法返回null BufferedReader。Eclipse只是说有一个NullPointerException是因为print方法,但是当我移除所有try/catch语句时,Eclipse说我需要编写方法抛出IOException或FileNotFoundException,它也允许我这样做,如果我不这样做,它就抛出一个FileNotFoundException。然而,