【问题标题】:how does method POST processes/excecutes in PHPPOST 方法如何在 PHP 中处理/执行
【发布时间】:2013-08-08 16:52:41
【问题描述】:

我正在构建一个 Web 应用程序,当我使用 POST 方法时,我有很多困惑。

假设我有以下代码

<?php
$abc = 'abc';
if(some condition){
   $abc = 'xyz';
}
if(isset($_POST['submit'])){

  header("Location:http://someexample.php/$abc");
  die();
}
?>

<form method="POST">
  <input type="text" name="textinput" />
  <input type="submit" name="submit" value="submit" />
  <input type="submit" name="clear" value="clear" />
</form>

所以根据我的理解,如果我没有错的话。 当我单击提交/清除按钮时。 PHP 文件首先重新加载 self 页面,然后再将其重定向到 header 位置。

如果我是对的。当我们处理大型 PHP 文件时,有没有其他方法可以避免多次重定向。当我有多个提交按钮时。

提前谢谢你

【问题讨论】:

  • 这个方法有什么问题?
  • 我有将近 6 个输入提交。并且每个人都重定向到同一页面,然后找出其下一页。似乎每次加载两个页面时..
  • 如所写,此代码不会重定向,因为您在调用 header() 之前执行了输出。
  • 您为每个表单定义单独的操作,这样会更容易处理...
  • 确定 Fred,会牢记这一点。谢谢你的时间..

标签: php forms post redirect header


【解决方案1】:

您基本上是将您的请求重定向到另一个页面。您应该使用表单的 action 属性,而不是使用 header 重定向页面。

<form method="POST" action="yourexample.php" id="myForm">
<input type="text" name="textinput" />
<input type="submit" name="submit" value="submit" />
<input type="submit" name="clear" value="clear" />
</form>

表单会将您重定向到第二页。如果您根本不想重新加载页面,则应该使用 ajax。您可以使用 jquery 并将您的值发布到另一个页面购买创建函数。在这种情况下,您的表单标签不应该有 action 属性,或者您 应该使用 preventDefault 方法。

$("#myForm").submit(function(event) {
event.preventDefault();
$.ajax({
type: "POST",
url: url,
data: data,
success: success,
dataType: dataType
});
});

url 将是您要将用户重定向到的页面的名称。 数据将成为您的表格。您可以使用 .serialize() 方法获取表单数据。

var data = $("myForm").serialize();

在成功的情况下,您可以定义一个函数,用于在成功的情况下做什么。

【讨论】:

    【解决方案2】:

    多次重定向没有错:这就是传统网络的工作方式。

    您可以通过使用 AJAX 调用来减少重定向次数。

    关于你的伪代码的一些注释:

    • Location 标头之前回显任何内容是毫无用处的:没有人应该阅读该消息。更不用说在 headers 之前不允许输出。
    • http:// 仅在完全限定 URI 的情况下允许在地址前面。

    所以,代码实际上必须是

    <?php
    if(isset($_POST['submit'])){
      header("Location: someexample.php");
      die();
    }
    ?>
    

    【讨论】:

    • 另外,您应该在 POST 调用后重定向的主要原因是用户不会一遍又一遍地发送表单,以防他出于任何原因尝试重新加载页面。
    • 启发我;您的代码如何与 OP 的表单一起实际工作?我无法理解它,还是只是我? (它不断抛出错误)
    • 好的,我知道你的代码为什么会出错。你忘了在if(isset($_POST['submit']){ 中加上结尾的),它应该是if(isset($_POST['submit'])){ - “即使是专业人士也会偶尔犯错。” ;-)
    【解决方案3】:

    表单总是发布到其中的“action”属性。如果您不希望它发布给自己,请将您的表单开始标签设置为&lt;form action="someexample.php" method="post"&gt;。结果将是 POST 数据发送到someexample.php,而不是发送到与表单相同的页面。

    如果您正在查看一个页面上的多个表单选项而无需重定向,请查看 AJAX 提交。

    我们的想法是将表单发送到您的接收文件,处理 POST 数据,并返回您想要从该过程返回的任何内容。例如:

    $("form").submit( function(event) {
        event.preventDefault(); //prevent the file submitting
        var formData = $(this).serialize(); //process the form into an array for submission
        $.ajax({
            url: "receiver.php", //the url of the receiving file
            type: "post", //setting method to post
            data: formData, //set the data being sent to the form contents
            success: function(response) {
                $("div").html(response); //set the receiving div to the html you echo'd in the php document
            }
        });
    });
    

    您的receiver.php 文件看起来与接收POST 数据的普通PHP 文档完全相同,因此&lt;?php if(isset($_POST['submit'])) {} ?&gt; 仍将完全按照您的预期工作,而无需页面重定向!不过,此解决方案确实需要 jQuery

    编辑:

    针对if(criteria) { $abc = 'xyz'; }的问题更新,有几点建议。

    要保持异步方法,请使用$_SESSION 变量。您可以使用receiver.php 设置它们并在起始文档中处理它们。

    要返回到同一个文档的标准提交方法,请将您的多个选项分解为单选输入、复选框或单独的表单。

    所以:

    <input type="radio" name="method" value="submit" />
    <input type="radio" name="method" value="clear" />
    

    这样你可以选择在那里提交的方法。

    或者您可以将它们分解为形式:

    <form method="post">
        <input type="submit" name="submit" value="submit" />
    </form>
    <form method="post">
        <input type="submit" name="clear" value="clear" />
    </form>
    

    最后,如果您想在提交和清除之间切换,您可以在点击时更改隐藏输入的值,因此:

    HTML:

    <form method="post">
        <input type="hidden" id="method" name="method" value="" />
        <input type="submit" id="submit" value="submit" name="submit" />
        <input type="submit" id="clear" value="clear" name="clear" />
    </form>
    

    jQuery:

    $("#submit").click( function(event) {
        event.preventDefault();
        $("#method").val("clear"); //set the method to clear
        $("form").submit(); //submit the form normally
    });
    $("#clear").click( function(event) {
        event.preventDefault();
        $("#method").val("submit");
        $("form").submit();
    });
    

    PHP:

    <?php 
    if(isset($_POST['submit'])) {
        //do something
    } elseif(isset($_POST['clear'])) {
        //do something else
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多