处理表单验证时避免重复使用代码

时间:2011-03-10 13:33:08

标签: php

我正在生成表单并在同一个文件中处理提交事件。

如果用户未输入标题,我想再次显示该表单并包含错误消息(例如“您忘记了标题。”)。

这意味着我必须重复两次代码 - 一次用于显示空表单,第二次用body显示表单并要求用户输入标题:

<?php if(strlen(strip_tags($_POST['posttitle'])) == 0):
    // Display the form with question body that user has entered so far and ask user to enter title.
?>
    <label for="title"><b>Title:</label><br/>
    <input type="text" name="posttitle" id="posttitle" />           
<?php endif;?>

<?php elseif ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action']) && $_POST['action'] == 'post') : ?>
<!-- Everything ok - insert post to DB -->
<?php else : 

   // just display form here (again ouch!)
    <label for="title"><b>Title:</label><br/>
    <input type="text" name="posttitle" id="posttitle" />
?>

5 个答案:

答案 0 :(得分:2)

这是一种快速的方法。

<form>
    <input type="text" name="title" value="<?php echo $_REQUEST['title']; ?>"/>
    <input type="text" name="field_a" value="<?php echo $_REQUEST['field_a']; ?>"/>
    ....
</form>

但我也可以建议你显示一个名为$title的var,这是检查$_REQUEST['title]的结果。

答案 1 :(得分:2)

您可以使用输出缓冲区来抓取表单,然后将其分配给变量,如下所示:

<?php

ob_start();
include('path/to/your/form');
$form = ob_get_flush();

// then later you can just go
print $form;

?>

希望这有帮助

答案 2 :(得分:2)

我会这样做:

如果REQUEST_METHODPOST,我将验证输入并收集数组中的消息(我的代码中为$errors)。

然后我只打印表单,如果出现错误,代码将打印出来。

<?php

$errors = array();

function print_value_for($attr) {
    if (isset($_POST[$attr]))
        echo $_POST[$attr];
}

function print_error_for($attr) {
    global $errors;

    if (isset($errors[$attr]))
        echo $errors[$attr];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // do validation here and add messages to $errors
    // like $errors['posttitle'] = "The title you entered is bad bad bad";

    if (empty($errors)) {
        // update database and redirect user
    }
}
?>

<!-- display the form and print errors if needed -->
<form>
    <?php print_error_for('posttitle'); ?>
    <input name="posttitle" type="text" value="<?php print_value_for('posttitle') ?>">

    <?php print_error_for('postauthor'); ?> 
    <input name="postauthor" type="text" value="<?php print_value_for('posttitle') ?>">

    <?php print_error_for('postbody'); ?>   
    <textarea name="postbody">
        <?php print_value_for('posttitle') ?>
    </textarea>

    <input type="submit">
</form>

PS。考虑使用MVC来分离代码和模板。

答案 3 :(得分:1)

当您显示表单时,请使用可能为空的$_POST值作为标题和问题正文的默认字段值。如果其中任何一个为空,则表单将第二次显示,另一个已填写:

<?php
$message = "";
if (empty($_POST['title'])) $message .= " Please enter a title.";
if (empty($_POST['body'])) $message .= " Please enter a body.";
?>

<form action='me.php'>
  <input name='title' type='text' value='<?php if (!empty($_POST['title'])) echo htmlentities($_POST['title'], ENT_QUOTES); ?>' />
  <textarea name='body'><?php if (!empty($_POST['body'])) echo $_POST['body']; ?></textarea>
</form>

答案 4 :(得分:0)

阅读此MVC

您可以在视图中编写表单,在控制器中编写处理程序,在模型中编写业务逻辑