【问题标题】:$_POST array empty in php after submission of a form using a formData使用 formData 提交表单后,php 中的 $_POST 数组为空
【发布时间】:2021-06-18 15:39:23
【问题描述】:

我看过几篇关于这个问题的帖子,但都没有解决我的问题。我正在使用 XAMPP,我在同一个文件夹中有一个 html index.html 和一个 php remote.php

我要发送到 php 的 formData 是使用 javascript 中的表单 (basic_form) 创建的。结果构造得很好,因为console.log(...formData); 打印了Array [ "mode", "basic" ], Array [ "file", File ],这是字符串和输入文件。

但不幸的是,在 php 中,命令 print_r($_POST); 仅输出 Array(),并且命令 var_dump($_POST); 输出 array(0){}。所以看起来表单的内容并没有传递给php。

这里是html表单:

<body>
    <div>
        <form name="basic_form" enctype="multipart/form-data" action="remote.php" method="post">
            <input type="text" id="mode" name="mode" value="basic"/>
            <input type="file" id="file" name="file"/>
            <input type="submit" id="submit_basic_input" name="submit_basic_input" value="Submit"/>
        </form>
    </div>
</body>

这里是提交表单的javascript:

<script>
    var basic_form = document.forms["basic_form"];
    basic_form.addEventListener('submit', e => {
        e.preventDefault(); 

        const url = 'remote.php';
        const formData = new FormData(basic_form);

        fetch(url, {
                method: 'POST',
                body: formData
            }).then(response => {
                console.log(response);
                if(response["status"] == 200)
                    location.replace(response["url"]);
        });
                
    });
</script>

这里是打印表单内容的php:

<?php
    var_dump($_POST);
    $datapost = $_POST;
    print_r($datapost);
    print($datapost["mode"]);
?>

【问题讨论】:

    标签: javascript php arrays forms post


    【解决方案1】:

    首先,您调用 fetch 发出 POST 请求

    当您收到响应时,您会记录响应对象(它不包含任何有用的东西,特别是响应的主体将显示为可读流而不是字符串)。

    该响应确实显示array(1) { ["mode"]=&gt; string(5) "basic" } Array ( [mode] =&gt; basic ) basic,但您可以使用浏览器开发者工具的“网络”选项卡查看它。

    在记录您设置的响应后 location.replace(response["url"]); 发出 GET 请求(到相同的 URL)并将浏览器导航到它。


    GET 请求是一个不同的请求,并且没有来自它的 POST 请求的请求正文。

    因为它是一个不同的请求,它得到一个不同的响应,现在$_POST是一个空数组。


    如果你想导航到响应然后摆脱 JavaScript。只需使用表单发出 POST 请求,然后让浏览器呈现结果页面。

    如果您想使用 Ajax 发出请求,那么:

    • 不要立即离开页面
    • 对响应做一些有用的事情(首先调用response.text()从响应正文中获取数据,然后可能使用createElementappendChild和朋友将数据添加到当前文档)

    【讨论】:

    • 非常感谢,我想念我同时执行 POST 和 GET 请求的事实(老实说,location.replace(response["url"]); 来自模板,我并不认为它有害)。我尝试在 POST 请求之后成功地将 $_POST 的内容保存到 php 文件中,并且符合预期。
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多