最佳实践:使用相同的表单进行创建和更新

时间:2010-08-13 07:36:33

标签: php html forms

我只是很好奇,如果你想使用相同的html表单并尽可能使用相同的php代码来创建和更新项目,我想知道你们如何处理它。

例:
在一个页面上,您可以创建一个包含姓名,电子邮件地址和年龄的数据库条目 在另一个(?)页面上,您会看到填写了数据的表单字段,您可以编辑并保存它。

我有很多方法可以使用几乎相同的代码完成此任务 - 但我希望在这里学到一些东西。那你将如何处理这项任务呢?

谢谢&干杯,扭伤

5 个答案:

答案 0 :(得分:6)

非常容易 - 如果查询字符串中提供了现有项目的ID(用户有权编辑),那么这就是编辑操作。

如果查询字符串中未提供ID,则为创建操作。

如果字段是编辑操作,则根据数据库中的现有值预先填充字段,如果是创建操作,则根据默认值或空字符串预填充字段。

答案 1 :(得分:3)

我看待它的方式是在某些情况下,在创建/编辑之间重复使用相同的表单标记,但不适用于所有情况。我发现这些表单 - 尽管它们可能映射到同一个数据库表 - 实际上是由它们的上下文定义的。例如,如果您有一个“用户”表,您可能会有一个包含用户名,电子邮件,密码的“创建”表单,但在该用户存在之后,您希望他们在其网站上保留其身份,因此不会显示用户名字段在“编辑”上下文中。我是一个经典的PHP开发人员,但我开始欣赏Django采用的方法,在这里创建一个模型(表),定义每个字段的基本验证,并且你可以创建尽可能多的表单,或修改/扩展该定义。如果您是从头开始编写,您可能会发现使验证方法非常便于移植和/或找到使表单字段对上下文敏感的方法很实用。

答案 2 :(得分:1)

这就是我现在一直这样做的方式。你在使用MVC系统吗?我使用一个带有两个不同动作的控制器(urls = person / new + person / edit / xxxx_id)。

代码如下:

function new()
    errors = []
    if (get)
        data = blank_record()
    elseif (post)
        data = posted_data
        if (create(data))
            redirect_to_listing()
        else
            errors = describe_errors
    show_form(data, errors)

function edit()
    errors = []

    if (get)
        data = get_from_db(id)
    elseif (post)
        data = posted_data
        if (save())
            redirect_to_listing()
        else
            errors = describe_errors
    show_form(data, errors)

请注意,一旦它到达表单,总会有一个名为data的对象,表单可以呈现,它可能是空白的,来自db或发布的数据。无论哪种方式,它应该始终是相同的格式。

我分拆新内容和编辑的原因是我发现他们的行为以及加载和保存步骤实际上非常不同。

答案 3 :(得分:0)

是的,这是唯一可接受的解决方案。

以下是CRUD应用程序的一个小例子,它将输入表单存储在模板中:

<?  
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 ?>

当然,有些花哨的表单构造函数,比如HTML_QuickForm2可以用来代替普通的HTML模板 - 你知道它的常量程序员不会重复自己,即使在命名HTML字段,字段值和错误键时也是如此:)
但我个人更喜欢简单的HTML。

答案 4 :(得分:0)

我想这不是正确的答案,但无论如何它可能对你有用。

有一个名为doctrine的orm项目: http://www.doctrine-project.org/projects/orm/1.2/docs/en

// User Id might be an existing id, an wrong id, or even empty:
$user_id = 4;
$user_id = null;

// Fetch the user from the database if possible
$user = Doctrine::getTable('Model_User')->find($user_id);

// If there was no record create a new one
if ( $user === false )
    $user = new Model_User();

// Change some data
$user->title = $newValue;

// Perform an update or an insert:
$user->save();

如您所见,您不必关心sql。 Doctrine为您做了这一点,您的代码变得更容易阅读和调试。

相关问题