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

PHP表单,如果填写不正确,所有字段都会自行清除,php,forms,Php,Forms,根据本教程,我制作了一份联系表: 一切正常,但有些参数没有处理 事实上,在提交时,如果用户没有正确填写表单,则会通知用户,并清除所有字段 对于用户来说,重新键入消息是一件痛苦的事情,因此我希望在不清除任何字段的情况下,通知他自己的错误 目前,有两种方法可以使表单出错。无论您是否填写电子邮件或姓名字段,或者垃圾邮件问题的答案是否错误 有可能防止这种情况发生吗 您可以在此处找到表格: 下面是php: <?php $name = $_POST['name']; $firm = $

根据本教程,我制作了一份联系表:

一切正常,但有些参数没有处理

事实上,在提交时,如果用户没有正确填写表单,则会通知用户,并清除所有字段

对于用户来说,重新键入消息是一件痛苦的事情,因此我希望在不清除任何字段的情况下,通知他自己的错误

目前,有两种方法可以使表单出错。无论您是否填写电子邮件或姓名字段,或者垃圾邮件问题的答案是否错误

有可能防止这种情况发生吗

您可以在此处找到表格:

下面是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>';
    }
    }
    ?>

使用
输入
属性在上一个表单中预插入用户的输入

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

示例:
  • 与PHP一起使用

    $value = isset($_POST["value"]) ? htmlspecialchars($_POST["value"], ENT_QUOTES) : "";
    /* ... snip ... */
    <input name="value" value="<?= $value ?>"> 
    这将使浏览器(假设它是现代浏览器)在表单提交时进行验证并确保它不是空的


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

使用
输入
属性在上一个表单中预插入用户的输入

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

示例:
  • 与PHP一起使用

    $value = isset($_POST["value"]) ? htmlspecialchars($_POST["value"], ENT_QUOTES) : "";
    /* ... snip ... */
    <input name="value" value="<?= $value ?>"> 
    这将使浏览器(假设它是现代浏览器)在表单提交时进行验证并确保它不是空的


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

在您的输入标记中说
,将其更改为此
在您的输入标记中说
,将其更改为此
首先,我会尽可能将后端代码与结构分离。如果有其他选择,我不会在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>

名字*

首先,我将尽可能地将后端代码与结构分离。如果有其他选择,我不会在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>

名字*


谢谢这超出了我对形式的理解。你有一个我可以测试的例子吗?我是一个真正的php初学者,我应该把值代码放在哪里。再次感谢。真的有理由逃避形式化的内容吗?@RafaelBarros你听说过XSS吗?(在这里读更多:)哦,是的。我知道。但是,如果在表单中显示内容,XSS是一个问题吗?如示例所示:
谢谢。这超出了我对形式的理解。你有一个我可以测试的例子吗?我是一个真正的php初学者,我应该把值代码放在哪里。再次感谢。真的有理由逃避形式化的内容吗?@RafaelBarros你听说过XSS吗?(在这里读更多:)哦,是的。我知道。但是,如果在表单中显示内容,XSS是一个问题吗?如示例中所示:
如果要保存流量,则必须执行javascript验证,但必须执行服务器端验证。感谢Justin,我如何让echo为“select”和“textarea”工作?如果要保存流量,则必须执行javascript验证,但必须执行服务器端验证。感谢Justin,我如何让echo为“select”工作和“textarea”?谢谢,除了列表和消息(textarea),这是有效的。有什么细节吗?我已经编辑了我的答案。现在可以用了吗?另外,请学习阅读代码。从它起作用的地方,你应该理解这个解决方案并自己应用它。谢谢,正如你所说的,我已经尝试将你的解决方案应用到我的其他输入中。你的新答案解决了列表的问题,但文本区域没有,它仍然不起作用。干杯编辑:如果是文本区域,则必须编辑内部文本。这反映在我编辑的帖子中,我已经解决了剩下的问题。在这里阅读更多:谢谢,除了列表和消息(textarea),这是有效的。有什么细节吗?我已经编辑了我的答案。现在可以用了吗?另外,请学习阅读代码。从它起作用的地方,你应该理解这个解决方案并自己应用它。谢谢,正如你所说的,我已经尝试将你的解决方案应用到我的其他输入中。你的新答案解决了列表的问题,但文本区域没有,它仍然不起作用。干杯编辑:如果是文本区域,则必须编辑内部文本。这反映在我编辑的帖子中,我已经解决了剩下的问题。请在此处阅读更多信息: