1

好的,这是一个常见的场景。

您有一个涉及编辑信息的 html 表单。原始信息来自数据库。当您发布表单时,它可能不会立即保存信息,因为在完成数据检查时可能需要修复某些内容,可能其中一个必填字段留空。结果,你想重新显示表单域,但是如果有post数据,则显示post数据,如果没有,则显示数据库中的原始数据。

所以我创建了一个函数来检查帖子,然后默认为一些任意数据(在这种情况下来自数据库)。

但总的来说,这种方法感觉不优雅,POST 数据被从全局函数内部无形地拉取,但如果我将 post 数据传递进去,我必须为每个函数调用传递它,而且它几乎和做它一样冗长每次手动,所以特别是我正在寻找这种方法的替代方法,通常我会喜欢关于更好的方法来处理这种我每次编辑 html 表单时处理的表单场景的建议。

// Pull from post or get, or else use data, e.g. from the database, to populate a form.
function in_or_data($index, $data, $trim=false){
    return $_POST[$index]? ($trim ? trim($_POST[$index]) : $_POST[$index]) : $data[$index];
}

<?php
$item_name = in_or_data('item_name', $data_from_database_somewhere); // Pull post data, with defaults coming from the 
?>

// ..... Later, some example html that just escapes & echoes out the data. .....
<td id='item-name'><input name="item_name" type="text" id="item_name" value="<?php echo escape($item_name); ?>" size="47" maxlength="100" tabindex="9"></td>

我如何改进处理最初从数据库中获取数据的表单,或者在完成某种提交后从发布中获取数据的表单?

4

3 回答 3

2
<input type="text" name="abc" value="<?php array_key_exists('abc', $_REQUEST) ? $_REQUEST['abc'] : "default value goes here" ?>" />

一个更优雅的解决方案,虽然工作量很大,但将涉及使用 ajax(jquery 等)在实际提交之前对表单执行服务器端验证。

于 2011-08-11T17:58:15.487 回答
1

你在做什么对我来说似乎很好。基本上我在相同情况下所做的是在表单中有一个隐藏字段,例如

<input name="is_edit"` ... />

并在我的 PHP 中进行检查,$_POST['is_edit']这样我就不会从数据库中填充任何内容。像上面那样单独处理每个字段的一个问题是,对于某些事情(例如复选框),如果用户不选中复选框,$_POST['checkbox_data']则不会设置,所以我相信你最终会从使用上述功能的数据库。它应该是由数据库提取的全部或全部。因此,我做了这样的事情:

<?php
if (isset($_POST['is_edit'])) {
    $var1 = $_POST['var1'];
    $var2 = $_POST['var2'];
    // etc
}
else {
    $data = do_db_query_and_get_data();
    $var1 = $data['var1'];
    $var2 = $data['var2'];
    // etc
}
?>
<input type="something" value="<?php echo $var1; ?>" />
<input type="something" value="<?php echo $var2; ?>" />
<input type="hidden" name="is_edit" value="1" />

这样做还具有另一个优点,即除非必要,否则不必进行数据库查询。

于 2011-08-11T18:07:00.837 回答
0

除了我最初的 php 代码之外,我还开始使用 html5 属性(如 required)并设置 html5 表单类型(如数字、电子邮件等)。它确实让我的表单对于支持 html5 表单方面的浏览器更好,并且降级到标准文本框并忽略不支持 html5 表单内容的浏览器中的 required 属性。

于 2011-09-01T15:57:41.250 回答