我的表单正常运行,所有错误和一切正常。 但是如果您有错误,它会刷新页面并删除在单击提交按钮之前插入的任何文本,并且您必须重新输入所有信息。 无论如何要解决这个问题?
我认为这与在表单的操作中不使用$ _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/>';
}
}
答案 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"
),那么该页面会刷新并且不会自动记住您之前提交的输入。
要做到这一点,你有两个选择:
true
,则恢复这些值并以这种方式获取:<input type="text" value="<?php echo $value ?>"/>
。另请注意,由于'.$_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。它们是一个特殊的构造,充当多行双引号字符串,但是你可以免于进行任何引用转义。它们提供了更易读的代码,当您跳入/跳出“字符串模式”输出变量时,您不必担心选择正确类型的引号或正确数量的引号。