使用 JavaScript Fetch 和 POST 发送表单数据,然后在 PHP 中处理它

Posted

技术标签:

【中文标题】使用 JavaScript Fetch 和 POST 发送表单数据,然后在 PHP 中处理它【英文标题】:Send form data using JavaScript Fetch and POST and then process it in PHP 【发布时间】:2020-07-31 13:22:21 【问题描述】:

所以基本上我想以这样一种方式设计我的页面,当用户发表评论时,页面不会刷新,但评论会被发送并插入到数据库中。

因此,我需要将评论本身发送到服务器,并且我已经读过最好的方法是使用 javascript FormData。问题是我无法让它实际发送一些东西,我希望它将 type="input" 元素中写入的数据发送到服务器。 我之前通过使用 html 表单元素本身提供的默认方式来做到这一点:action=link method="post"。

所以我想将广告系列的 id 附加到 url,并尽可能使用 $_POST 和 JavaScript DataForm 将评论本身发送到服务器,这样它就知道应该有该评论的广告系列。

我可以有多个广告系列,它们都将“动态”生成,可以说,使用 php 和 JavaScript 脚本来处理它们的行为,所以这就是我回应所有这些的原因。

<form id="commentForm' . $row['id'] . '" name="commentForm"  method="post" class="greyContainerAllCampaigns">
<input id="comment' . $row['id'] . '" name="CommentContent" max="250" title="max 250 alphanumeric and ,.?: etc chars" required pattern='.' \'[A-Za-z0-9 .,!?:\[\]()"-+]+\' ' .'class="inputBox" type="text"  placeholder="write here">
<button  id="commentB' . $row['id'] . '" class="submitButton" type="submit"  name="Comment">Comment</button></form>';

这是我尝试编写的 JavaScript 脚本:

          document.getElementById("commentB' . $row['id'] . '").addEventListener("click", commentFunction);

          function commentFunction() 

            fetch(\'http://localhost:80/proiect/GaSM/public/Campaign/comment/'. $row['id'] . '\', 
              method: \'POST\',
              body : new FormData(document.getElementById("commentForm' . $row['id'] . '")),
              headers: \'Content-Type\':\'multipart/form-data\'


            );

            alert ("You left a comment!");
          

    </script>';

我尝试使用 $_POST['CommentContent'] 在服务器上获取结果,但我什么也没收到,也没有发送任何内容。

我尝试通过 POST 将其发送到 JavaScript 脚本中的服务器的方式显然做错了,但我不知道是什么。 提前致谢!

【问题讨论】:

【参考方案1】:

首先,给表单元素一个普通的 id。不确定您现在要做什么,但如果您想使用 PHP 来呈现它,请在 PHP 开始和结束标记之间使用echoid="&lt;?php echo 'commentForm' . $row['id']?&gt;"。就像现在一样,我怀疑您的 Javascript 总是在寻找带有文字字符串 'commentForm' . $row['id']' 的表单。 row['id'] 不被视为变量。

接下来,这个fetch 函数的语法看起来完全无效。 FormData 可以很好地与 XMLHttpRequest 配合使用,我相信这就是您想要的。

例如:

<?php
<script>
    let xhr = new XMLHttpRequest();

    // Your logic for handling the response of the server
    xhr.onreadystatechange = function() 
        if (4 !== this.readyState) 
            // not yet ready
            return;
        
        if (200 !== this.status) 
            //handle error response
            return;
        
        // Handle something good...
    

    xhr.open('POST', 'https://my.page/comment/' + <?php echo $row['id'] ?>);
    xhr.send(new FormData(document.getElementById('myForm')));
</script>
?>

【讨论】:

javascript let button = document.getElementById('thatFormButtonId'); button.addEventListener('click', (event) =&gt; event.preventDefault(); // insert AJAX code here ); 不确定这是否也会阻止表单本身提交。在这种情况下,您可以执行以下操作:javascript let form = document.getElementById('thatForm'); form.addEventListener('submit', (event) =&gt; event.preventDefault(); // insert AJAX code here ); 我在这一行的第一种方法出现了一个意外的标识符错误:javascript let button = document.getElementById('commentB1');即使commentB1 是表单提交按钮的ID,那也是我使用chrome devtools/inspect 元素检查它的时候。如果可以的话,我会发送一张图片,这样会更容易说明 在上面的代码中,你给按钮的 ID 是commentB' . $row['id'] . ',这对我来说看起来很容易出错。例如。它的最后一个字符有一个空格,这可能会导致您出现该错误,因为'commentB1' 没有该空格。不过你是对的,如果我们能看到更直观的东西会更容易。【参考方案2】:

你如何给表单一个类,并在 javascript 中为这个表单添加一个事件,每当它被提交以向表单操作发出 Ajax 请求时,该表单的数据已被序列化。

$(“.form”).on(“submit”, function(e) 
    $form = $(this);
    $.ajax(
        url: $form.attr(“action”),
        type: “post”,
        data: $form.serialize(),
        success: function(res) 
            alert(“success”);
        ,
        error: function(error) 
            alert(“error”);
        
    );
    e.preventDefault();
    return false;
);

【讨论】:

最简单的方法是在每个表单中放置隐藏的输入以指示可能通过 id 进行的活动 评论将自动发送,只要它是您表单中的有效表单元素

以上是关于使用 JavaScript Fetch 和 POST 发送表单数据,然后在 PHP 中处理它的主要内容,如果未能解决你的问题,请参考以下文章

Javascript fetch 处理 json 和 blob

如何使用 javascript fetch api 和 express multer 上传图像

JavaScript fetch API和Python Flask头问题

如何向 javascript 的 fetch() 函数发送附加数据

在 Javascript/Reactjs 中使用 Fetch API 和 map() 显示 JSON 数据

JavaScript 中的 Promises/Fetch:如何从文本文件中提取文本