【问题标题】:Sending data to PHP with XMLHttpRequest (vanillaJS) and reading that in php with $_POST? Undefined使用 XMLHttpRequest (vanillaJS) 向 PHP 发送数据并使用 $_POST 在 php 中读取数据?不明确的
【发布时间】:2018-12-03 14:55:31
【问题描述】:

我有一个从 HTML 获取参数的 Javascript 函数。

    function find(customer) {
        data = {"key":customer};
        console.log(data);
        var xhr = new XMLHttpRequest();
        var url = "test.php";
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
        xhr.send(data);

        xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
              console.log(xhr.responseText);
            }
        };
    }

日志产生正确的信息,即

{key:"103"}

然后在 PHP 中,我尝试像这样访问这些数据:

if (isset($_POST['data'])) {
    $number = $_POST['data'];
}

echo $number;

但是,PHP 向我抛出了一个错误:

注意:未定义索引:第 22 行 .\test.php 中的数据

这意味着 if(isset($_POST['key']) 返回 false,我不知道为什么。我可以使用 Ajax 找到大量信息,但没有太多指导我使用标准 Javascript。

编辑:

根据 cmets 将 $_POST['data'] 更改为 $_POST['key']

现在接收变量错误(未定义),而不是索引错误。

注意:未定义变量:第 22 行 .\test.php 中的数字

【问题讨论】:

  • PHP 不会收到“数据”的参数,因为您在 javascript 方面所指的“数据”映射到服务器上的 $_POST 超全局变量,所以 $数据 = $_POST。所以你应该可以把它读成$_POST['key'];
  • @Jackhardcastle 正确。小错误,但修复后,我仍然有同样的问题。
  • 请不要更改代码,因为它会使 cmets/answers 看起来很愚蠢。而是添加和编辑并进行更改
  • 其实错误已经改变了。现在它是未定义的变量。
  • 并且总是向我们展示完整的错误信息

标签: javascript php


【解决方案1】:

这是您要发送的内容:

data = {"key":customer};
xhr.send(data);

...但是当该对象转换为字符串时,您会得到:[object Object],而您的实际数据将丢失。

你说:

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');

声称您正在向服务器发送application/x-www-form-urlencoded 数据。

您需要转换data,使其与您声称的内容类型相匹配。

This question addresses how to do that


此外,如果一个地方您将密钥命名为data,而另一个地方则将其命名为key。您必须始终使用相同的名称。

【讨论】:

  • 有趣。那么如果是 text/html 和 data = number,它应该可以工作吗?
  • PHP 不理解 text/plain MIME 类型,因此甚至不会尝试解析它以填充 $_POST(并且 plain/text 根本不是标准 MIME 类型)。
  • 道歉。我还在学习 PHP(只有几个星期)。您能否指出我应该如何发送这些数据的资源?
  • @Karim — 我做到了。单击此答案中的链接。
  • 那么,如果我总是要发送一个 3 位数的字符串,那么只发送字符串版本(而不是键:值)会更容易(而不是转换数据)吗?例如,数据 = 字符串(数字)。我知道这可能不是正确的语法,或者您甚至可以像在 python 中那样进行类型转换。我现在只是在概念上思考。
【解决方案2】:

key实际上是key而不是data

data = {"key":customer};

所以改变:

if (isset($_POST['key'])) {
    $number = $_POST['key'];
}

echo $number;

但是,如您所见,$number 仅在 if 条件中定义。 所以,你可以定义一个默认值

if (isset($_POST['key'])) {
    $number = $_POST['key'];
} else {
    $number = 0;
}

echo $number;

【讨论】:

  • 正确。对不起。但是,修复后我仍然遇到同样的问题。
  • 一个不同的问题,对不起。注意:未定义变量:第 22 行 .\test.php 中的数字
  • 更新了,看看吧。
  • 在定义 else 之后,它返回 0 (正如预期的那样,因为我们知道 if 条件失败)。我想我的问题是为什么它失败了?根据上面的代码,为什么 number 的值没有正确传递给 PHP?
【解决方案3】:

正如 Quentin 所说,您是在告诉服务器您发送的数据是 application/x-www-form-urlencoded 而不是。你可以:

  • 使用类似于 Quentin 答案中链接的函数将您的数据转换为 application/x-www-form-urlencoded
    如果您不关心 IE/Edge 支持,您也可以使用 URLSearchParams,使用不错的 xhr.send(new URLSearchParams(data))。 [见caniuse data]
  • 忘记$_POST,使用简单的JSON.stringify(data) 将您的数据编码为JSON 字符串,并告诉您的服务器您正在发送JSON (xhr.setRequestHeader("Content-Type", "application/json"),然后使用$data = json_decode(file_get_contents('php://input'), true); 获取您的数组

【讨论】:

  • PHP 不会自动使用 JSON 编码数据填充 $_POST。如果这样做,您还需要编写服务器端代码来读取原始请求正文并对其进行解析。
  • 是的,我忘记了,我会编辑我的答案。最后,这只是您要如何以及在何处进行转换的问题,我只是认为我更喜欢在浏览器中使用简单的JSON.stringify,而在服务器中使用简单的json_decode(尤其是像Slim这样的框架这样做-开箱即用)。
【解决方案4】:

试试 var_dump($_POST);出口;你会看到 POST 数组中没有任何数据键,而是你有 'key' 键,所以而不是 $_POST['data'] 写 $_POST['key']

【讨论】:

    【解决方案5】:

    先尝试打印所有帖子数据,你会得到正在发布的真实姓名

    print "<pre>";
    print_r($_POST);
    

    在您的 PHP 代码中,这将使用您获得的参数的实际名称输出发布的数据,只需使用该参数即可,而不是 $_POST["data"] 我假设您具有 $_POST["key"] 中的值。

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2023-03-07
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多