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

时间:2010-06-08 11:21:13

标签: php html 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;
    }
}

9 个答案:

答案 0 :(得分:16)

,表单只有一个操作。

但你有选择:

的Javascript

但是,您可以使用 javascript

更改操作属性
<input type="submit" value="Edit" onclick="editform();return true;">
<input type="submit" value="Delete" onclick="deleteform();return true;">

和一些小javascript:

function editform() {
    document.myform.action = '/edit';
}
function deleteform() {
    document.myform.action = '/delete';
}

另见

多种形式

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

Multiple forms = multiple actions

javascript禁用客户端没有问题,并且符合标准。

多个提交按钮 - 服务器端

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

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

<input type="submit" name="btSubmit" value="Edit">
<input type="submit" name="btSubmit" value="Delete">

然后,您可以检索已单击的按钮的值。在php中,以下应该完成这项工作:

$_POST['btSubmit']

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

答案 1 :(得分:6)

可以使用JavaScript,但不推荐使用它,因为有些人因为特洛伊木马和某些网站的嘈杂行为而默认关闭JS。在启用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'; 
}  
?>

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>

list.php的

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

答案 2 :(得分:4)

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

例如:

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

header("Location: " . $page);

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

编辑:正如 Col。所指出的那样。使用header()进行下面的弹片是非常没有意义的,因为它会消灭你的$ _POST数组 - 改为使用include(),但要小心只允许自己的文件,不要让用户名将包含的文件(例如,使用表单字段值来选择包含的文件)。

答案 3 :(得分:3)

不,你不能在html中有多个动作,但是你可以使用javascript根据点击的按钮来切换动作。

我会做这样的事情(在假mootools中)

<form action='default.php'>
 ... form elements ...

<button onclick='editButtonClick()' value='edit'/>
<button onclick='deleteButtonClick()' value='delete'/>
</form>

function editButtonClick() {
   $('form').action = 'editaction.php';
   $('form').submit();
}

function deleteButtonClick) {
   $('form').action = 'deleteaction.php';
   $('form').submit();
}

答案 4 :(得分:1)

不,它不能(至少不能依赖JavaScript)。

提交到一个URI,并有一个调度例程将数据传递给不同的函数,具体取决于所选的单选按钮(或其他)。

答案 5 :(得分:1)

如果我正在考虑这样做,我会通过POST传递你想做的事情。

然后根据一组函数检查该值,并且每个函数将根据它的选择执行不同的操作

答案 6 :(得分:0)

<input type="submit" value="Add" onclick="submitForm(this,'add')" />
<input type="submit" value="Update" onclick="submitForm(this,'update')" />
<input type="submit" value="Delete" onclick="submitForm(this,'delete')" />

var submitForm = function(context,uri)
{
    form = contenxt.parent; //Go back to the form
    form.action = uri; // Set the action
    form.submit(); //Submit the form;
}

Java脚本是处理此问题的最佳方式,除非您创建3个唯一表单,否则没有太多选择。

答案 7 :(得分:0)

将表单发布到中央formhandler脚本。在该页面上只需使用简单的逻辑(在此实例中使用php)将用户重定向到您想要的特定页面

答案 8 :(得分:-1)

在提交页面上,您可以调用CURL并将所有Get或post变量提供给该URL。