PHP表单设计最佳实践

8
我已经使用PHP有一段时间了,一直想知道如何用一个表单来处理对数据库的更新和插入操作。目前,我使用两个不同的表单来完成这个任务,它们都包含基本相同的信息和文本框等。我知道有更好的方法来处理这个问题,但我不确定是什么。
过去,我尝试过使用单个表单,但是HTML与PHP混合在一起看起来很糟糕,而且很难维护。我追求“干净”和整洁。
请问有人能指导我正确的方向吗?
其中一个我必须使用的东西是POST值,如果用户提交表单并且验证没有通过,则刷新时不应清除已输入的值。
2个回答

5
您可以使用一个表单,其中包含一个隐藏的id字段。如果设置了此字段,则应使用表单的其余部分更新$_POST['id']记录。如果未设置该字段(即它的值为""),则应将表单数据插入新记录中。
根据操作设置id字段,例如/data/edit/1将设置id字段为1,而/data/new将不对其进行设置。
例如,您的视图可能是:
<form action="/data/edit/1">
<input type="hidden" value="<?php echo $data->id; ?>" />
<input type="text" value="<?php echo $data->name; ?>" />
</form>

如果有新记录,请使用以下数据调用您的视图。
$data->id = '';
$data->name = '';

如果已知记录,则只需使用数据初始化$data对象

$data->id = $record_id;
$data->name = $record_name;

嗨,Elazar,感谢您的帮助。有没有示例或者您能提供一个链接,以便我可以看到您的意思?这很有道理,但我无法想象它。我认为您的建议与我一开始的做法并没有太大的区别。 - Jim
2
不要忘记检查当前用户是否拥有该ID。 - Antony Carthy
如果编辑操作中包含ID,为什么还要有一个ID字段呢? - rojoca
@rojoca:不需要有id,但我认为最好总是有id,并将新的标记为"id =''",而不是在表单内放置if语句来决定是否放置id字段。 - Elazar Leibovich
@Elazar: 表格中没有 [if],因为没有 id 字段。如果是编辑,则 id 在 action /data/edit/1 中。另外,如果您在 URL 中提交了 id,并且还通过表单提交了 id,则必须验证该 id 两次。如果您的 id 在 URL 中,则路由代码可以在开始处理 post 数据之前验证和认证请求。 - rojoca
@rojoca:你的设计意味着你不会总是将表单提交到同一个URL。因此,你会将ID放在URL中而不是字段中。这也是可能的,但我没有看到任何优势。 (在我的设计中,常量URL发送数据+1,你的设计中,身份验证+1)。虽然我不确定为什么路由代码会处理身份验证,但这并不是很好。 - Elazar Leibovich

1

这是我可能会在不使用任何其他框架/库等的情况下完成它的方式。基本上就是Elazar Leibovich所说的。

  <?php
    //id is zero or a record id depending on whether updating or inserting
    //an existing record could be edited using edit.php?id=10
    //if the id GET parameter is omitted a new record will be created
    $id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0;
    $error = '';

    if ($id) {
        //this array would be in the same format as the one below
        $record = fetchRecordFromDb($id);    
    } else {
        $record = array( 'field1' => 'default value', 'field2' => 'some other default' );    
    }

    //allow POST data to override what is already in the form
    foreach ($record as $key => $value) {
        if (isset($_POST[$key])) {
            $record[$key] = $_POST[$key];
        }
    }

    if (isset($_POST['submit'])) {
        if (!validateForm()) {
            $error = 'Some form error';
        } else {
            if ($id) {
                updateRecord($id, $record);
            } else {
                insertRecord($record);
            }

            //ok, redirect somewhere else
            header('Location: http://somewhere');
            exit();
        }
    }

    ?>

    <form method="post">
       <?php echo $error; ?>
       <input type="hidden" name="id" value="<?php echo $id; ?>">
       <input type="text" name="field1" value="<?php echo htmlspecialchars($record['field1']); ?>"><br />
       <input type="text" name="field2" value="<?php echo htmlspecialchars($record['field2']); ?>"><br />
       <input type="submit" name="submit">
    </form>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接