一个表单可以有多个动作吗?

Bro*_*ias 5 html php forms action

我想根据表单中的选择将表单提交到不同的地方.我最初计划将所有内容发送到中央文件/位置,并让它确定下一步要去哪里.但是,如果可以的话,我想不做这个额外的步骤.

如果用户想要创建/编辑/删除元素,请转到第1页.
如果用户想要分组/附加元素,请转到第3页.

我正在尝试编写表单生成器.您可以创建/编辑/删除表单,问题和答案.我有完成创建,编辑和删除的所有内容.这些功能在不离开页面的情况下执行,但现在我希望为特定问题分配答案.问题页面和答案页面是分开的.我想要选择一组答案并将一组答案ID(选中的复选框)提交到问题页面,然后将那些ID分配给一个问题.所以基本上创建,编辑和删除功能都是打开而不离开页面,但是assign函数将在不同的页面上执行.

if(empty($delRowID) || empty(updateRowID) || empty($groupRows)) {
    qInsert();
}else{
    if(!empty($delRowID)) qDelete($delRowID);
    if(!empty(updateRowID)) qUpdate($updateRowID);
    if(!empty($groupRows)) {
        submit $groupRows to Question.php;
    }
}
Run Code Online (Sandbox Code Playgroud)

mar*_*pet 18

,表单只有一个动作.

但你有选择:

使用Javascript

但是,您可以使用javascript更改action属性:

<input type="submit" value="Edit" onclick="editform();return true;">
<input type="submit" value="Delete" onclick="deleteform();return true;">
Run Code Online (Sandbox Code Playgroud)

加上一点点javascript:

function editform() {
    document.myform.action = '/edit';
}
function deleteform() {
    document.myform.action = '/delete';
}
Run Code Online (Sandbox Code Playgroud)

也可以看看

多种形式

如果javascript不适合您,您可以在页面中考虑多个表单.

Multiple forms = multiple actions
Run Code Online (Sandbox Code Playgroud)

javascript禁用客户端没有问题,符合标准.

多个提交按钮 - 服务器端

或者您可以在服务器端处理编辑或删除的区别.不需要JavaScript.

向表单添加多个提交按钮,并为它们指定相同的名称,但值不同:

<input type="submit" name="btSubmit" value="Edit">
<input type="submit" name="btSubmit" value="Delete">
Run Code Online (Sandbox Code Playgroud)

然后,您可以检索已单击的按钮的值.在PHP中,以下应该做的工作:

$_POST['btSubmit']
Run Code Online (Sandbox Code Playgroud)

有关经典asp的示例,请参见http://www.chami.com/tips/internet/042599I.html.

  • 如果禁用了JS,则可以使用多个具有唯一值的提交按钮。 (2认同)

You*_*nse 6

可以使用JavaScript,但不推荐使用它,因为有些人因为特洛伊木马和一些网站的嘈杂行为而默认关闭JS.让您的网站在启用JS和禁用的情况下工作都是礼貌的.

实际上,您不需要很多表单操作,因为每个操作都可以使用单个表单处理程序脚本中的分支来完成.
这是一个非常简单的CRUD应用程序示例,执行显示,编辑,添加 - 所有这些都在一个主体中并使用模板:

的index.php

<?  
mysql_connect(); 
mysql_select_db("new"); 
$table = "test"; 
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part: 
  $name = mysql_real_escape_string($_POST['name']); 
  if ($id = intval($_POST['id'])) { 
    $query="UPDATE $table SET name='$name' WHERE id=$id"; 
  } else { 
    $query="INSERT INTO $table SET name='$name'"; 
  } 
  mysql_query($query) or trigger_error(mysql_error()." in ".$query); 
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);  
  exit;  
}  
if (!isset($_GET['id'])) { //listing part: 
  $LIST=array(); 
  $query="SELECT * FROM $table";  
  $res=mysql_query($query); 
  while($row=mysql_fetch_assoc($res)) $LIST[]=$row; 
  include 'list.php'; 
} else { // form displaying part: 
  if ($id=intval($_GET['id'])) { 
    $query="SELECT * FROM $table WHERE id=$id";  
    $res=mysql_query($query); 
    $row=mysql_fetch_assoc($res); 
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v); 
  } else { 
    $row['name']=''; 
    $row['id']=0; 
  } 
  include 'form.php'; 
}  
?>
Run Code Online (Sandbox Code Playgroud)

form.php的

<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>
Run Code Online (Sandbox Code Playgroud)

list.php的

<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
Run Code Online (Sandbox Code Playgroud)


Mat*_*ews 5

只需将它们发送到中心位置,然后根据选择的内容使用逻辑将它们发送到其他位置。

例如:

<?php
switch($_POST['choice']) {
    case 'edit':
        $page = 'edit.php';
        break;
    case 'group':
        $page = 'group.php';
        break;
}

header("Location: " . $page);
Run Code Online (Sandbox Code Playgroud)

(显然需要一些输入过滤和默认值)

编辑:如下面的Shrapnel校长所指出的header(),为此使用是毫无意义的,因为它随后将清除$ _POST数组-使用include()代替,但要小心,只允许自己创建文件,而切勿让用户命名文件将包含在内(例如,使用表单字段值来选择包含的文件)。