如何在提交时停止表单字段清除?

时间:2014-03-19 11:33:03

标签: php forms submit

我试图创建一个带有验证码问题的php表单,但是在提交时,表单字段被清空(如果它们没有填写所有必填字段等,则会很烦人)。我确信解决方案必须简单。

这是我提交的代码:

if ($_POST['submit']) {
    if ($name != '' && $email != '') {
        if ($human == '4') {                 
            if (mail ($to, $subject, $body, $from)) { 
            echo '<p>Your message has been sent!</p>';
            unset($_POST);
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        } 
    } else if ($_POST['submit'] && $human != '4') {
        echo '<p>You answered the anti-spam question incorrectly!</p>';
    }
    } else {
        echo '<p>You need to fill in all required fields!!</p>';
    }

6 个答案:

答案 0 :(得分:3)

看起来您可能依赖于注册全局变量(除非您在其他位置设置$name),而应该从$_POST获取表单数据。

为了在提交和验证失败后保留表单值,我建议保留一个可以在表单提交后修改的数组:

$display = array(
    'name' => '',
    'email' => '',
    'message' => ''
);

if($_SERVER['REQUEST_METHOD'] == 'POST'){
    foreach($_POST as $key => $value){
        if(isset($display[$key])){
            $display[$key] = htmlspecialchars($value);
        }
    }
}

在表单中,使用$display数组设置每个值:

<form>
    <input type="text" name="name" value="<?php echo $display['name']; ?>" />
    <input type="text" name="email" value="<?php echo $display['email']; ?>" />
    <input type="text" name="message" value="<?php echo $display['message']; ?>" />
</form>

答案 1 :(得分:0)

您没有获得表单字段的值。

你应该像$name = $_POST['name'];

一样使用

答案 2 :(得分:0)

您实际上必须重新设置值,例如

<input name="text" <?php isset($_POST['text'])?'value="'.htmlspecialchars($_POST['text']).'"':''; ?>>

...

<input name="check" type="checkbox" <?php isset($_POST['check'])?'checked':''; ?>>

每种类型的领域可能需要不同的技术。

答案 3 :(得分:0)

如果填写了数据,则需要echo表单字段,因为默认情况下,表单回发会重新加载所有HTML,以便清除字段。

你应该这样做:

<?php
$to="";
$from="";
$body="";
$subject="";

//check for "submit click"
if(isset($_POST['submit'])){
    $to=$_POST['to'];
    $from=$_POST['from'];
    $subject=$_POST['subject'];
    $body=$_POST['body'];


   //your email code here

}


?>

<form action="your_script.php" method="post">
      From: <input type="email" name="from" value="<?php echo $from;?>"/>
      <br/>
      To: <input type="email" name="to" value="<?php echo $to;?>"/>
      <br/>
      Subject: <input type="te3xt" name="subject" value="<?php echo $subject;?>"/>
      <br/>
      Body: <textarea name="body"><?php echo $body;?></textarea>
      <br/>
      From: <input type="email" name="from" value="<?php echo $from;?>"/>
      <br/>

      <input type="submit" name="submit" value="Send"/>

</form>

答案 4 :(得分:0)

不需要

,使用预填(已发布)值进行表单

存在更容易的解决方案

在form.php发送正确的缓存HTTP标头(禁用重新验证)

Date: Wed, 19 Mar 2014 11:44:01 GMT
Expires: Wed, 19 Mar 2014 11:44:01 GMT (means now, not history)
Cache-Control: private, max-age=0
Pragma: private

<form action="post.php"> ....

并在post.php发现错误

<a href="javascript:window.history.go(-1);">go back</a> and correct error

表单与发布前的状态相同

答案 5 :(得分:0)

如果你有习惯离开&#34; id&#34;财产总是等于&#34;名称&#34;你的html元素中的属性,你可以像这样做:

<script type="text/javascript" src="path/to/jquery.min.js"></script>
<script type="text/javascript">
    $().ready(function(){
        //<?php foreach ($_POST as $fieldName => $fieldValue): ?>
        $("#<?php echo $fieldName; ?>").val("<?php echo yourSanitizationFunction($fieldValue); ?>");
        //<?php endforeach; ?>
    });
</script>

这将使您的代码更清晰,而不是手动设置每个字段中的值。但也许你需要使用不同的技术来收音机和检查按钮。