【问题标题】:how to have 2 actions on 1 submit button如何对 1 个提交按钮进行 2 个操作
【发布时间】:2012-02-06 14:40:04
【问题描述】:

我有一个带有提交按钮的表单。单击提交按钮时,它会将信息发送到 mysql。这一切正常,但是当单击提交按钮时,它只会重新加载页面。我希望它能够将信息发送到 mysql 然后转到页面thankyou.html。

我的提交按钮是:

<input type="submit" name="submit" id="submit" value="Submit" /> 

我的表单操作是:

<form name="list"; action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" >

【问题讨论】:

  • 挑剔点:您的表单不会“将数据发送到 mysql”。它被发送到一个 PHP 脚本,该脚本处理 mysql。

标签: php javascript forms onsubmit


【解决方案1】:

这个 php 代码会让你跳到另一个页面:

<?php
if ($_POST) { // check something is being sent by the form
    // MySQL stuff here...
    header("location:thankyou.html");
    exit;
}
?>
// put the form here

或者您可以将向数据库插入数据的 php 放在thankyou.html 的顶部,然后让表单在那里提交。

我个人喜欢将插入内容与表单保持在同一页面上,但这只是个人选择。

重要提示:在调用 php 重定向之前,页面没有任何输出,甚至没有空格,因此请确保将您的开始 php 标签放在文件的顶部,并且不要打印或回显任何内容。

【讨论】:

  • 我真的认为这是矫枉过正(或者我可能误解了这个问题......)
  • header 应该在mysql 操作之后和任何输出之前使用。假设当前文件处理 mysql 操作。
  • @JMax:真的吗?正如我所说,我喜欢将插入代码与调用表单本身保持在同一页面上,因此我经常使用标题重定向(如果我不使用模板)。我猜服务器上的开销有点多,因为它正在加载两个文件,但我相当确定 OP 没有在高流量站点上实现它;-)
  • 嗯,它不起作用。基本上我需要提交按钮将信息发送到 mysql(我已经完成并且正在工作)但之后转到thankyou.html
  • 将上面的代码放在 MySQL 插入代码之后应该可以正常工作。你有错误吗?
【解决方案2】:

由于您将form 提交到同一页面,服务器将(在处理该页面上的任何 PHP 代码之后)显示该页面。你有几个选择:

  1. 将表单提交到不同的页面。
  2. 处理表单后从页面重定向。

第一个选项意味着您要将form 中的action 更改为如下内容:

<form name="list" action="formhandler.php" method="post">

这意味着formhandler.php(或您决定调用的任何名称)将拥有服务器端 PHP 代码来处理表单,然后该页面将显示您想要显示的任何内容。

第二个选项只涉及在您的 PHP 代码中使用重定向(在您已经提交的页面上),以便在处理表单后将用户引导到不同的页面。 PHP header() function 是执行此操作的标准方法。像这样的:

header("Location: thankyou.php");

应该本质上是 PHP 代码在处理您的表单后所做的最后一件事。也就是说,您可能不希望您的服务器端代码在直觉上是终止案例之后继续执行。因此,您需要在它之后立即调用exit 以停止页面执行。 (请记住,实际的重定向不是服务器端操作,服务器只是将 Location 标头发送到浏览器并告诉浏览器 it 应该执行重定向。)

(此外,正如此处其他答案中所述,执行此类重定向时,页面不应有其他输出。)

另外,我想你也可以在你的 PHP 页面上有条件输出,如果它不处理 POST 或另一组内容(感谢页面),则显示一组 HTML 内容(表单)如果它正在处理POST,但这对我来说就像一个滑坡。最好将服务器端资源分开,而不是拥有一个有条件地执行不同操作的命名资源 (somepage.php)。 (单一职责原则)

【讨论】:

  • "这实际上是 PHP 代码在处理完表单后所做的最后一件事。"事实并非如此。标头只影响浏览器 - PHP 脚本将继续运行直到它终止,因此您应该始终使用exit; 跟随该行。这是你通常很难学会的东西=]
  • 感谢 David 和 Grim,@Grim 您说将标头代码放入您的 SQL 插入代码使用的相同 if 语句中。你是什​​么意思?如果有,你能举个例子吗?
  • 我的回答有一个粗略的例子——基本上,如果有东西要提交,你应该只向数据库提交数据——并且只有在提交成功时才应该重定向。
  • @user1191294:您的 PHP 代码当前如何辨别它是最初显示页面还是响应表单操作?这就是有问题的条件。通常的模式(伪代码)是:if (handling_a_form_post) { do DB_insert; do redirect; } else { do display_page; }
  • 你能直接看下面这个 fleppars 的帖子吗?它似乎正在工作,但在表单所在的链接之后放置 %20?>?submit=1?
【解决方案3】:

可以一直使用 JS

<? if(!empty($_POST['submit']){


    //do mysql stuff here

    ?>
    <script type="text/javascript">
    <!--
    window.location = "thankyou.html "
    //-->
    </script><?
    }?>

【讨论】:

  • 什么时候比header("Location: x");更好?
【解决方案4】:

我建议将操作放到thankyou.php 页面,然后使用post 将mysql 插入代码放在该页面上。

<form name="list" action="thankyou.php" method="post">

此外,如果您希望所有内容都在同一页面上,您可以使用

<form name="list" action="<?php echo $_SERVER['PHP_SELF']; ?>?submit=1" method="post" >

在页面顶部的 PHP 代码中,做一个快速

<?php if ($_GET['submit'] == '1') header('Location: http://www.example.com/'); ?>

【讨论】:

  • 谢谢这只是把 %20?>?submit=1 放在我的链接后面?例如假设我的表单在 www.google.com/login.php 上,当点击提交按钮时它会转到 www.google.com/login.php%20?>?submit=1
猜你喜欢
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多