filter_input 和在 objective ajax 请求后直接访问 $_POST 的区别

Difference between filter_input and direct acces on $_POST after objective ajax request

我使用 filter_input(INPUT_POST, 'attribute')$_POST['attribute'] 得到了不同的结果,不知道为什么会这样。

Post-请求由 JavaScript 使用 JQuery 构建发送,看起来像这样:

// type javaScript
var formData = {
  field_a: "valueA",
  field_b: "",
  field_c: undefined
};
$.ajax({
  url: 'serverAddress',
  data: {action: 99, formData: formData},
  dataType: 'json',
  method: 'post',
  success: function(){
    console.log(arguments)
  }
});

我的 PHP-脚本看起来像这样:

// type php
$requestMethod = INPUT_POST;
$response = [
  "fi-result" => filter_input($requestMethod, 'formData'),
  "direct-result" => $_POST['formData'];
];
echo json_encode($response);

返回的结果不是我等待的结果,因为在我的测试中通过 filter_input returns false 访问,而不是像 json 对象直接访问超级全局 $_POST.

// type json response
{
  "fi_result": false,
  "direct-result": {
    "field_a": "valueA",
    "field_b": ""
  }
}

为什么使用 filter_input 和 $_POST 直接访问之间存在差异?

我不想访问超级全局 $_POST。有没有办法像上面那样使用 filter_input 而无需在 JavaScript 中将 formData 编码为字符串并在编码后的 PHP 中解码一个简单的步骤?

顺便说一句。我正在使用 TypeScript 生成我的 JavaScript。那不支持 FormData 对象(转译器在 new FormData() 上抛出错误)。所以我不能用这个。

我在 PHP 文档中找到了答案。 POST 不是为了传输深层对象而构建的。 filter_input 方法尝试获取简单的数据类型,如字符串或整数。此方法不解析内部,因此我必须将其作为 JSON 字符串发送并对其进行解码,否则在我的情况下我不能使用 filter_input。

我拿了第一个,现在发送字符串。