将多个表单元素用于不同的操作是一种好习惯吗?

时间:2014-05-29 06:50:24

标签: php html mysql sql forms

我想知道你是否可以拥有一个包含多个动作的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) ?

2 个答案:

答案 0 :(得分:1)

你做得很好。另一种方法是使用多个Submit按钮。提交按钮可以使用formaction属性指定其他网址:

<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'])

答案 1 :(得分:-1)

一种形式很好(在大多数情况下,更容易和更一致 2 )。代码可以根据数据/状态执行任何操作:此案例涉及每个操作中的不同表格这一事实无关紧要 1

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


1 要查看所执行的操作真的不重要,请考虑代码是否写成如下,其中操作本身是一个&#34;黑盒子&#34;

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

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