【问题标题】:Is it good practice to use multiple form elements for different actions?为不同的操作使用多个表单元素是一种好习惯吗?
【发布时间】:2014-07-18 14:37:09
【问题描述】:

我想知道您是否可以拥有一个包含多个操作的 HTML 表单。好吧,我的意思不是指定多个action="" 属性。假设我有一个简单的表格:

form.html

<form action="action.php" method="post">
  <label><input type="radio" value="r1" id="r1" name="r" />Insert in table1</label><br/>
  <label><input type="radio" value="r2" id="r2" name="r" />Insert in table2</label><br/>
  <label>Value 1<input type="text" id="t1" name="t1" /></label><br/>
  <label>Value 2<input type="text" id="t2" name="t2" /></label><br/>
  <label><input type="submit" value="Submit" /></label><br/>
</form>

action.php

$con = mysqli_connect("example.com","user","pwd","db");
$r = $_POST["r"];
$t1 = $_POST["t1"];
$t2 = $_POST["t2"];
switch($r):
  case 'r1':
    if($q = $con -> prepare("INSERT INTO table1 VALUES (?, ?)")):
      $q -> bind_param("ss",$t1,$t2);
      if($q -> execute()):
        echo 'Successfully updated table1.';
        $q -> close();
      endif;
    endif;
    break;
  case 'r2':
    if($q = $con -> prepare("INSERT INTO table2 VALUES (?, ?)")):
      $q -> bind_param("ss",$t1,$t2);
      if($q -> execute()):
        echo 'Successfully updated table2.';
        $q -> close();
      endif;
    endif;
    break;
endswitch;
mysqli_close($con);

所以我根据无线电输入更新table1table2,并使用用户提交的值。请注意,我已经阻止了 SQL 注入。所以我的问题是,这是一种好的做法,还是我应该制作两个表格,每个表格都有不同的action=""(使用query string 在它们之间切换,比如/main.php?form=form1/main.php?form=form2)?

【问题讨论】:

    标签: php html mysql sql forms


    【解决方案1】:

    你正在做的很好。另一种方法是使用多个Submit 按钮。提交按钮可以使用formaction 属性来指定不同的 URL:

    <input type="submit" formaction="main.php?action=form1" value="Insert in table1"/>
    <input type="submit" formaction="main.php?action=form2" value="Insert in table2"/>
    

    当您点击提交按钮时,formaction 会覆盖表单的 action 属性。

    那么你就可以在PHP中使用switch($_GET['action'])了。

    【讨论】:

    • 如果用户按回车键提交怎么办?哪个input 将被“按下”?
    • 第一个提交按钮的名称/值被发送到服务器,但我不确定这是否意味着它也使用第一个按钮的formaction URL。
    • 必须检查一下,如果没有其他人会更快,我会回来回答的。编辑:嗯,那是相当快的。是的,如果用户按下回车键,那么它将像按下第一个 input 一样,这意味着它将使用其 formactionname/value
    【解决方案2】:

    一种形式就可以了(而且,在大多数情况下,更容易且更一致2)。代码可以根据数据/状态执行所需的任何操作:这种情况在每个操作中涉及不同表的事实是无关紧要的1

    由于单选按钮被用作鉴别器,它实际上 必须 是相同的形式(因此是相同的操作)而没有不稳定的客户端 JavaScript 修改 - 这是因为单选按钮本身可以只参加一种形式。


    1 要查看执行的操作真的无关紧要,请考虑代码是否编写如下,其中操作本身就是一个“黑匣子”。

    case 'r1': f1(); break;
    case 'r2': f2(); break;
    

    2 对于单独的表单/操作,需要提出一些论据,尤其是在尝试遵守 REST 或 POST/GET 差异和幂等行为规则时;但这不能仅与上述(或帖子中的示例)争论。我不会捍卫或纵容呈现的界面。

    【讨论】:

    • (如果您投反对票,请解释原因 - 这将允许我修正/修改或捍卫立场,或完全撤回答案。否则,我不知道什么是“错误” .)
    • 反对者确实应该发表评论,我发现这个答案很有帮助。
    猜你喜欢
    • 2016-07-01
    • 2016-05-27
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2019-05-30
    • 2011-03-06
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多