【问题标题】:How do I stop the form fields from clearing on submission?如何阻止表单字段在提交时清除?
【发布时间】:2014-04-25 14:50:34
【问题描述】:

我正在尝试创建一个带有验证码问题的 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>';
    }

【问题讨论】:

  • 你好。我应该用isset检查提交吗?我只是试了一下,但没有任何改变。对不起,新手问题!
  • if (isset($_POST['submit'])) {print_r($_POST['submit']);}

标签: php forms submit


【解决方案1】:

看起来您可能依赖于寄存器全局变量(除非您在其他地方设置 $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>

【讨论】:

  • 感谢 MrCode!这对我帮助很大:)
【解决方案2】:

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

你应该使用$name = $_POST['name'];

【讨论】:

  • 我不确定你的意思拉维?除了在提交时清空字段之外,该表单运行良好。
【解决方案3】:

如果您习惯在 html 元素中让“id”属性始终等于“name”属性,则可以执行以下操作:

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

这将使您的代码比在每个字段中手动设置值更简洁。但也许您需要使用不同的技术来单选和选中按钮。

【讨论】:

  • 很好的方法,为我节省了很多时间。
【解决方案4】:

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

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

...

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

每种类型的字段可能需要不同的技术。

【讨论】:

    【解决方案5】:

    如果数据已填满,您需要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>
    

    【讨论】:

      【解决方案6】:

      不需要,使用预先归档(发布)的值进行表单

      存在更简单的解决方案

      在 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
      

      表单将处于与发布前相同的状态

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多