【问题标题】:Two actions two submit button in php?php中的两个动作两个提交按钮?
【发布时间】:2014-04-11 00:14:36
【问题描述】:

我有这样的表单标签

sample name:register.php page

<form id="formElem" name="formElem" action="form10.php" method="post">
<input id="pd" name="pd" type="text" AUTOCOMPLETE=OFF />
<input id="pd1" name="fname" type="text" AUTOCOMPLETE=OFF />
<input id="pd2" name="mname" type="text" AUTOCOMPLETE=OFF />
<input id="pd2" name="lname" type="text" AUTOCOMPLETE=OFF />
6 more input boxes
<button name="submit" type="submit">Register</button>
<button name="preview" type="submit">Preview</button>

</form>

我将此信息发送到下一个 form10.php 页面并在该页面上显示所有 10 个输入值 我正在使用 $pd= htmlentities($_POST['pd']); $fname= htmlentities($_POST['fname']); 从表单标签和这样的 10 个变量中获取值,我正在回显那些输入的值 成功提交按钮后在form10.php文件上。

就像我输入了fname、mname、lname来自form标签并显示在form10.php页面上。

first name <?echo $fname?> 

但现在的问题是用户在表单标签内仅输入 10 个文本框值后可以看到下一页 (form10.php)。 但我想为用户提供预览选项,以便用户可以预览下一页或者填充 1 到 10 个文本框值中的任何一个。表示他已填写 fname 和 lname 但未填写其余 8 个字段,他单击预览按钮我想打开与 form10.php 相同的 form10_preview.php 但由于用户只输入了 fname 和 lname 所以只回显他提供的那些值.

现在的问题是我怎样才能在一个表单中拥有两个提交按钮和两个操作?

【问题讨论】:

  • 我不认为你不能在一个表单中有 2 个动作,但它可能会使用 js 或仅使用 php/html 更改动作属性,你可以尝试这样的事情:stackoverflow.com/questions/547821/… (有 2 个具有相同操作的按钮,但取决于 $_POST['action'](单击的提交按钮)然后重定向到“最终表单”或“预览表单”*不能有 2 个操作跨度>

标签: javascript php html


【解决方案1】:

我认为最好在客户端控制表单提交规则。从表单中删除action,并将按钮类型更改为button

<form id="formElem" name="formElem" action="" method="post">
<input id="pd" name="pd" type="text" AUTOCOMPLETE=OFF />
<input id="pd1" name="fname" type="text" AUTOCOMPLETE=OFF />
<input id="pd2" name="mname" type="text" AUTOCOMPLETE=OFF />
<input id="pd2" name="lname" type="text" AUTOCOMPLETE=OFF />
6 more input boxes
<button id="register" type="button">Register</button>
<button id="preview" type="button">Preview</button>
</form>

然后让javascript控制提交的流程:

var formElem = document.getElementById('formElem'),
    btnSubmit = document.getElementById('register'),
    btnPreview = document.getElementById('preview');

function formSubmit() {
    switch (this.id) {
        case 'register' :
            formElem.action='post10.php';
            break;
        case 'preview' :                    
            formElem.action='preview10.php';
            break;
    }
    formElem.submit();
}

btnSubmit.onclick = formSubmit;
btnPreview.onclick = formSubmit;

【讨论】:

  • 我想我需要调用这个函数。在脚本标签中发布 javscript 代码后什么都没有发生。
  • 控制台出现错误?将脚本放在表单之后。
  • 参见 fiddle -> jsfiddle.net/y3TQz,在您自己的计算机上取消注释 formElem.submit() 而不是警报。
  • 这个答案比我的好。更优雅,更干净。使用这个。
  • @davidkonrad 我用这段代码创建了这个简单的 html 页面,但它不起作用它没有重定向页面 sharetext.org/T8HA
【解决方案2】:

您可以让表单指向它自己的页面并分别处理每个提交值。在带有表单的文件顶部,您需要启动输出缓冲区和会话。这允许使用 header() 来重定向和存储会话变量。

<?php 
    ob_start(); 
    session_start();
?>

表单将通过删除 action 属性指向自身:

<form id="formElem" name="formElem" method="post">
    <input id="pd" name="pd" type="text" AUTOCOMPLETE=OFF />
    <input id="pd1" name="fname" type="text" AUTOCOMPLETE=OFF />
    <input id="pd2" name="mname" type="text" AUTOCOMPLETE=OFF />
    <input id="pd2" name="lname" type="text" AUTOCOMPLETE=OFF />
    6 more input boxes
    <button name="submit" type="submit">Register</button>
    <button name="preview" type="submit">Preview</button>
</form>

我们通过它们在 POST 数组中的名称来处理每个按钮:

<?php
    if(isset($_POST['submit'])){
        foreach ($_POST as $key => $value) {
            $_SESSION[$key] = $value;
        }
        header("Location: form10.php");
    }
    if(isset($_POST['preview'])){
        foreach ($_POST as $key => $value) {
            $_SESSION[$key] = $value;
        }
        header("Location: form10_preview.php");
    }
?>

在文件的最后,我们刷新输出缓冲区:

<?php ob_end_flush(); ?>

所以,表单本质上只有一个动作,就是将值提交给它自己。最后,form10.php 和 form10_preview.php 都需要 session_start();在文件顶部访问我们创建的 Session 变量,如下所示:

<?php 
session_start();

$inputs = array("pd", "fname", "mname", "lname", etc...);

foreach ($inputs as $input) {
    echo $_SESSION[$input];
}

?>

【讨论】:

  • post 数组的 php 代码将在我的表单标签正确的同一页面上?
  • 是的,同一页。我确实需要再添加一件事,即将 $_POST 数据获取到重定向页面。这是在 if(isset()) 语句之后完成的,以便在我们重定向时包含所有数据。我现在正在添加代码。
猜你喜欢
  • 1970-01-01
  • 2014-01-01
  • 2011-06-12
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多