2011-03-10 64 views
0

我正在生成表單並在同一個文件中處理提交事件。處理表單驗證時避免代碼重用

如果用戶沒有輸入標題,我想再次顯示錶單幷包含錯誤信息(例如「您忘了標題。」)。

這意味着,我要重複的代碼兩次 - 一次到diplay空的形式,二來顯示與身體形態,提示用戶輸入標題:

<?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" /> 
?> 
+1

可能使用變量而不是複製粘貼,例如, 'if(form is empty){$ message ='Form is empty'} elseif {$ message = null; } ...然後僅在表單上顯示變量,只有在出現問題時纔會顯示,如果我不明白,則會顯示,這就是爲什麼我使用了註釋.. – Daniel 2011-03-10 13:38:43

+0

U確實理解正確。我明白了。謝謝 – 2011-03-10 13:50:09

回答

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來分離代碼和模板。

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這是對$_REQUEST['title]檢查的結果。

2

你可以使用輸出緩衝搶的形式,然後將其分配給一個變量,像這樣:

<?php 

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

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

?> 

希望這有助於

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

閱讀本MVC

你可以寫在視圖的形式,在控制器的處理程序,並在模型

業務邏輯