我的表格有问题吗?

时间:2010-12-14 16:41:43

标签: php email forms action

我的表单正常运行,所有错误和一切正常。 但是如果您有错误,它会刷新页面并删除在单击提交按钮之前插入的任何文本,并且您必须重新输入所有信息。 无论如何要解决这个问题?

我认为这与在表单的操作中不使用$ _SERVER [“PHP_SELF”]有关。 相反,我有动作=“”

我这样做是因为需要使用相同信息刷新的页面在其url(monthly_specials_info.php?date = Dec10)中有一个变量,该变量放在最后一页。

我尝试使用

<form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">

它产生了正确的网址。但是在提交表单时(包含错误),文本都被删除了..任何想法?

表格代码:

echo '    <div id="specialsForm"><h3>Interested in this coupon? Email us! </h3>
                                            <form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">
                                              Name: <input name="name" type="text" /><br />
                                              Email: <input name="email" type="text" /><br />
                                              Phone Number: <input name="phone" type="text" /><br /><br />
                                              Comment: <br/>
                                              <textarea name="comment" rows="5" cols="30"></textarea><br /><br />
                                              <input type="submit" name="submit" value="Submit Email"/>
                                            </form></div>
                                            <div style="clear:both;"></div><br /><br />';

和vaildator:

if(isset($_POST['submit'])) {

                                                $errors = array();
                                                if (empty($name)) {
                                                    $errors[] = '<span class="error">ERROR: Missing Name </span><br/>';
                                                }
                                                if (empty($phone) || empty($email)) {
                                                    $errors[] = '<span class="error">ERROR: You must insert a phone number or email</span><br/>';
                                                }
                                                if (!is_numeric($phone)) {
                                                    $errors[] = '<span class="error">ERROR: You must insert a phone number or email</span><br/>';
                                                }
                                                if (!preg_match('/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/', strtoupper($email))) {
                                                    $errors[] = '<span class="error">ERROR: Please Insert a valid Email</span><br/>';
                                                }
                                                if ($errors) {
                                                    echo '<p style="font-weight:bold;text-align:center;">There were some errors:</p> ';
                                                    echo '<ul><li>', implode('</li><li>', $errors), '</li></ul><br/>';
                                                } else {
                                                    mail( "email@hotmail.com", "Monthly Specials Email",
                                                        "Name: $name\n".
                                                        "Email: $email\n".
                                                        "Phone Number: $phone\n".
                                                        "Comment: $comment", "From: $email");
                                                    echo'<span id="valid">Message has been sent</span><br/>';
                                                }
}

6 个答案:

答案 0 :(得分:1)

第一:你不能信任'。$ _ SERVER它可以被修改。小心点!

第二:您可以(应该?)使用hidden字段而不是在操作中指定它吗?

  

但是如果你有错误,它会刷新   页面并删除任何文本   在提交按钮之前插入   点击,你必须重新输入所有   的信息。无论如何要修复   此?

您可以使用ajax来修复它(我相信普通的旧HTML会产生这种副作用吗?)。

答案 1 :(得分:1)

浏览器不必(p)重新填写表单。有些是为了方便,但你不能依赖它。

如果再次显示表单,您可以设置输入值,如下所示:

$value = isset($_POST['foo']) : $_POST['foo'] : '';
echo '<input type="text" value="'. $value .'" name="foo" />';

当然,您应该检查并清理POSTed数据,然后再将其包含在HTML中,以免打开任何XSS漏洞。

答案 2 :(得分:0)

如果您希望表单提交到同一页面,您不需要设置操作,它也可以在没有它的情况下运行。另外我建议你以这种方式发送日期:

<input type="hidden" name="date" value="'.$date.'"/>

答案 3 :(得分:0)

首先,一些一般性的变化:

变化

<form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">

<form method="post" action="'.$_SERVER["PHP_SELF"].'">
    <input type="hidden" name="data" value="'.$date.'" />

原始问题的答案:

如果input

,请将每个value元素$_POST['whatever']属性设置为array_key_exists('whatever', $_POST);

例如:名称字段

<input type="text" name="name" value="<?php echo array_key_exists('name', $_POST) ? $_POST['name'] : ''; ?>" />

答案 4 :(得分:0)

部分原因是验证器和html代码内部存在一些重大问题,而且我要改变的是,我要问的是:如何使编译的表单不会从我的输入中删除所有文本刷新后的标签。

基本上不了解您的项目,提交字符串的位置,如果它们存储在数据库或其他地方,那么该页面在项目上下文中意味着什么,我无法编写一个特定的脚本,使得提交的字符串记忆在一个将来重新加载页面,但澄清一些事情:

如果某个表单定义为<form></form>并且提交了<input type="submit"/>(这应该足够了,而不是给它命名name="submit"),那么该页面会刷新并且会自动记住您之前提交的输入。 要做到这一点,你有两个选择:

  1. 使用Ajax(将Jquery检查为ajax的良好框架),这将允许您在不刷新页面的情况下提交表单。我选择它作为第一种方式,因为它被所有人过度使用,它将变得越来越多,因为它是新的,它运作顺畅。
  2. 创建一个php脚本,允许您检查输入是否已经提交;如果答案是true,则恢复这些值并以这种方式获取:<input type="text" value="<?php echo $value ?>"/>
  3. 另请注意,由于'.$_SERVER["PHP_SELF"].'?date='.$date.'已足够,因此您不需要?date='.$date.'

答案 5 :(得分:0)

浏览器不会为您重新填充表单,尤其是在执行POST时。由于您没有使用填充了value=""块的字段构建表单,因此浏览器只会为您渲染空字段。

一个非常基本的表单处理脚本看起来像这样:

<?php

if ($_SERVER['REQUEST_METHOD'] = 'POST') {
    # do this only if actually handling a POST
    $field1 = $_POST['field1'];
    $field2 = $_POSt['field2'];
    ...etc...

    if ($field1 = '...') {
       // validate $field1
    }
    if ($field2 = '...') {
       // validate $field2
    }
    ... etc...

    if (everything_ok) {
        // do whatever you want with the data. insert into database?
        redirect('elsewhere.php?status=success')
    } else {
       // handle error condition(s)
    }
} // if the script gets here, then the form has to be displayed

<form method="POST" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
<input type="text" name="field1" value="<?php echo htmlspecialchars($field1) ?>" />
<br />
<input type="text" name="field2" value="<?php echo htmlspecialchars($field2) ?>" />
etc...
<input type="submit" />
</form>

?>

注意在最后一位使用htmlspecialchars(),其中输出表单字段。考虑有人在字段中输入html元字符("<>)的情况。如果由于某种原因必须显示表单,这些字符将输出到html并“打破”表单。每个浏览器都会以不同的方式“破解”。有些人不会在乎,有些人(*咳嗽* IE *咳嗽*)会在地板上留点。通过使用htmlspecialchars(),这些元字符将被“转义”,以便它们能够正确显示并且不会破坏表单。

同样,如果您要输出大量的HTML,并且可能在其中嵌入PHP变量,那么您最好阅读HEREDOC。它们是一个特殊的构造,充当多行双引号字符串,但是你可以免于进行任何引用转义。它们提供了更易读的代码,当您跳入/跳出“字符串模式”输出变量时,您不必担心选择正确类型的引号或正确数量的引号。