通过FETCH将查询字符串参数发送到php不起作用

2022-05-28 00:00:00 php javascript fetch-api

我只想通过Fetch API向(同一页)php脚本发送一个查询字符串参数。这样做的目的是,我可以将存在于Java脚本中的变量存储在php$_SESSION变量中。但它不起作用。

背景:我编写了一些检测多个单选按钮中哪个单选按钮被打开的脚本。此单选按钮的值存储我希望作为SSI从数据库加载的PHP模板的名称。

因此,我并不是真的想在Java脚本中操作响应,我只是希望能够将变量(在本例中是硬编码的,但打算来自一个Java脚本变量)传递给PHP$_GET或$_POST。

感谢到目前为止回复的人。

代码如下:

<?php 

if(isset ($_REQUEST['name'])){
    echo "The name param is received!";
}
else {
    echo "The name param is NOT received!";
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home</title>
</head>
<body>

   <script>
 
       fetch('index.php?name=matt');

   </script>
</body>
</html> 

解决方案

我建议您查看MDN Fetch() API documentation。您的fetch()缺少其标头、方法、响应解析(第一个.then())和结果解析(第二个.then())。

但是,您可能不想使用fetch()。Fetch将页面结果返回给JavaScript,而不是用户。从您使用它的方式来看,您似乎只想让用户直接转到该页面(在这种情况下,只需<a href='?name=matt'>Click Me</a>)。

归根结底,我认为您需要了解fetch()的目的是将数据发送到JS环境,而不是为用户重新加载页面。无论如何,下面是您的调用在工作时的样子...

<script>
       fetch('index.php?name=matt', {
        'headers': {
            'Accept': 'text/html',
            'Content-Type': 'text/html'
        },
        'method':'GET',
        'body':'',
    })
   .then((response) => response.text())
   .then((responseText)=>{
       console.info("Response?");
       console.info(responseText);     // result: "The name param is received!...(and the rest of your page)
   });
</script>

如果您想让Fetch()以可用的方式将$_GET和/或$_POST变量返回给JS,那么欢迎JSON和json_encode()进入您的内心。

创建一个新的PHP脚本userdata.php,并将其编码为...

<?php
    header('Content-Type: application/json');   // send JSON header, let page know it's JSON
    print(json_encode(['name':$_POST['name']]));    // get the name
?>

使用此选项,将您的上述JS更新为...

fetch('http://www.example.com/your/script.php', {
    'headers': {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
    },
    'method':'POST',
    'body':JSON.stringify({'name':'matt'}),
})
.then((response) => response.json())
.then((responseJson)=>{
    console.info("Response?");
    console.info(responseJson);
});

注意上面所做的更改:我让它使用POST方法,这为您提供了一种更简洁的发送数据的方式(即使用body,而不是像'?...'那样将其附加到URL上)。您的回复也是.json()‘d’,而不是.text()d。

相关文章