0

我正在构建一个 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 页面,然后再将其重定向到标题位置。

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

先感谢您

4

3 回答 3

1

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

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

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

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

所以,代码实际上必须是

<?php
if(isset($_POST['submit'])){
  header("Location: someexample.php");
  die();
}
?>
于 2013-08-08T16:57:55.587 回答
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();

在成功的情况下,您可以定义一个函数来处理成功的结果。

于 2013-08-08T17:13:22.313 回答
0

表单总是发布到其中的“action”属性。如果您不希望它发布给自己,请将您的表单开始标签设置为<form action="someexample.php" method="post">. 结果将是 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 文档完全相同,因此<?php if(isset($_POST['submit'])) {} ?>仍将完全按照您的预期工作,而无需页面重定向!这个解决方案确实需要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
}
于 2013-08-08T17:03:26.253 回答