PHP表单,如果填写不正确,所有字段都会自行清除

Posted

技术标签:

【中文标题】PHP表单,如果填写不正确,所有字段都会自行清除【英文标题】:PHP Form, if not filled properly, all field clear themselves 【发布时间】:2014-02-15 09:07:32 【问题描述】:

我按照本教程制作了一个联系表格:http://tinyurl.com/nyxv8ub

一切正常,但某些参数未处理。

事实上,在提交时,如果用户没有正确填写表单,他会收到通知,并且所有字段都会自行清除。

用户重新输入他的信息很痛苦,所以我希望在不清除任何字段的情况下通知他他的错误。

目前,有两种方法可以弄错表格。无论您没有填写电子邮件或姓名字段,还是当垃圾邮件问题的答案有误时。

是否有可能防止这种情况发生?

您可以在这里找到表格:http://bettercheckthekids.com/Form/index.php

这里是php:

<?php
    $name = $_POST['name'];
    $firm = $_POST['firm'];
    $email = $_POST['email'];
    $list = $_POST['list'];
    $message = $_POST['message'];
    $spam = $_POST['spam'];
    $from = 'From: Adiwatt Online'; 
    $to = 'clement.fauquet@gmail.com'; 
    $subject = 'Hello';

    $body = "From: $name\n Firm: $firm\n E-Mail: $email\n Objet: $list\n Message:\n $message";
    ?>


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

【问题讨论】:

【参考方案1】:

首先,我会尽可能地将后端代码与结构分开。如果我有任何其他选择,我不会在 php 代码中生成 html。您的结构应如下所示:

<form method="post" action="index.php"> 
    <label>Name *</label>
    <input name="name" placeholder="..." value="<?php echo ((isset($_POST["name"])) ? (htmlspecialchars($_POST["name"], ENT_QUOTES)) : ("")); ?>">

    <label>Firm</label>
    <input name="firm" placeholder="..." value="<?php echo ((isset($_POST["firm"])) ? (htmlspecialchars($_POST["firm"], ENT_QUOTES)) : ("")); ?>">

    <label>Email *</label>
    <input name="email" type="email" placeholder="..." value="<?php echo ((isset($_POST["email"])) ? (htmlspecialchars($_POST["email"], ENT_QUOTES)) : ("")); ?>">

    <label>Object</label>
    <select name="list" id="list"> 
       <option value="Pas d'objet" <?php if ((isset($_POST["list"])) && ($_POST["list"] === "Pas d'objet")) echo "selected"; ?>>--</option> 
       <option value="Je veux sortir" <?php if ((isset($_POST["list"])) && ($_POST["list"] === "Je veux sortir")) echo "selected"; ?>>Object 1</option> 
       <option value="Je sortirai demain" <?php if ((isset($_POST["list"])) && ($_POST["list"] === "Je sortirai demain")) echo "selected"; ?>>Object 2</option> 
       <option value="Je n'ai pas d'argent" <?php if ((isset($_POST["list"])) && ($_POST["list"] === "Je n'ai pas d'argent")) echo "selected"; ?>>Object 3</option> 
    </select> 

    <label>Message</label>
    <textarea name="message" placeholder="..."><?php echo ((isset($_POST["message"])) ? (htmlspecialchars($_POST["message"], ENT_QUOTES)) : ("")); ?></textarea>

    <label>What is 2+2? (Anti-spam) *</label>
    <input name="spam" placeholder="..." value="<?php echo ((isset($_POST["spam"])) ? (htmlspecialchars($_POST["spam"], ENT_QUOTES)) : ("")); ?>">    

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

干杯!

【讨论】:

谢谢,这对列表和消息 (textarea) 有效。有什么具体的吗? 我已经编辑了我的答案。它现在工作了吗?另外,请学习阅读代码。从它工作的地方,您应该了解解决方案并自行应用它。 谢谢,正如您所说,我已经尝试将您的解决方案应用于我的其余输入。您的新答案解决了列表的问题,但没有解决文本区域的问题,它仍然无法正常工作。干杯! 已编辑:在 textareas 的情况下,您必须编辑内部文本。这反映在我编辑的帖子中,我已经解决了剩下的问题。在这里阅读更多:***.com/questions/6007219/…【参考方案2】:

使用inputvalue 属性将用户的输入预先插入到前一个表单中。

此外,您可以在输入中使用 HTML5 的 required 属性,并使用 javascript 确保在提交表单之前正确设置所有字段。

示例:

在 PHP 中使用 value

$value = isset($_POST["value"]) ? htmlspecialchars($_POST["value"], ENT_QUOTES) : "";
/* ... snip ... */
<input name="value" value="<?= $value ?>"> 

使用required 属性

&lt;input name="value" <strong>required</strong>&gt;

这将使浏览器(假设它是现代浏览器)进行验证并确保在提交表单时它不为空。

对于 JavaScript,请阅读表单的 onsubmit 事件和输入的 value 属性。

【讨论】:

谢谢。这超出了我对表格的理解。你有我可以测试的例子吗? 我是一个真正的php初学者,我应该把值代码放在哪里。再次感谢。 真的有理由逃避表单中的内容吗? @RafaelBarros 你听说过 XSS 吗? (在这里阅读更多:acunetix.com/websitesecurity/cross-site-scripting) 哦,是的。我很清楚。但是,如果您在表单中显示内容,XSS 会出现问题吗?就像示例中一样:&lt;input name="value" value="&lt;?= $value ?&gt;"&gt;【参考方案3】:

在您的输入标签中说&lt;input name="name" placeholder="..."&gt;,将其更改为&lt;input name="name" placeholder="..." value="&lt;?php if(isset($POST['name'])) echo $_POST['name'] : '' ?&gt;"&gt;

我的示例还有三元运算符变体,如下所示:value="&lt;?php echo isset($POST['name']) ? $_POST['name'] : '' ?&gt;"

【讨论】:

如果您想节省流量,请执行 javascript 验证,但服务器端验证是必须的。 谢谢贾斯汀,我怎样才能让 echo 为“select”和“textarea”工作?

以上是关于PHP表单,如果填写不正确,所有字段都会自行清除的主要内容,如果未能解决你的问题,请参考以下文章

防止用户在字段中输入错误信息时清除字段中的信息。

每次刷新页面时,PHP 电子邮件表单都会发送电子邮件

在正确的信息通过之前需要提交两次PHP表单

php - 从数据库值填写表单字段

仅当使用引导程序填写所有必需的 attr 字段时,如何提交表单?

如何创建不属于表/表单的字段影响选项选择的动态表单