繁体   English   中英

使用XMLHttpRequest(vanillaJS)将数据发送到PHP并使用$ _POST在php中读取数据? 未定义

[英]Sending data to PHP with XMLHttpRequest (vanillaJS) and reading that in php with $_POST? Undefined

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

    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的指导。

编辑:

根据评论将$_POST['data']更改$_POST['data'] $_POST['key']

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

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

这是您要发送的:

 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 ,使其与您声明的内容类型匹配。

这个问题解决了如何做到这一点


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

您的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;

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

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

尝试var_dump($ _ POST); 出口; 并且您将看到POST数组中没有任何数据密钥,而是具有“密钥”密钥,因此可以用$ _POST ['key']代替$ _POST ['data']

尝试先打印所有发布数据,您将获得要发布的实际名称

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM