Php 数据验证失败时在表单字段中保留值
当验证失败时,我很难确定如何保留用户数据。我对PHP有些陌生,所以我可能在逻辑上犯了一些大错误 当前,如果验证失败,所有字段都将被清除,$\u Post数据也将消失 下面是一些代码,假设用户输入了无效的电子邮件,我希望保留名称字段。此代码不起作用Php 数据验证失败时在表单字段中保留值,php,validation,forms,Php,Validation,Forms,当验证失败时,我很难确定如何保留用户数据。我对PHP有些陌生,所以我可能在逻辑上犯了一些大错误 当前,如果验证失败,所有字段都将被清除,$\u Post数据也将消失 下面是一些代码,假设用户输入了无效的电子邮件,我希望保留名称字段。此代码不起作用 <?php if($_POST['doSubmit'] == 'Submit') { $usr_name = $data['Name']; $usr_email = $data['Email']; if (isEmail($
<?php
if($_POST['doSubmit'] == 'Submit') {
$usr_name = $data['Name'];
$usr_email = $data['Email'];
if (isEmail($usr_email)==FALSE){
$err = "Email is invalid.");
header("Location: index.php?msg=$err");
exit();
}
//do whatever with data
}
if (isset($_GET['msg'])) {
$msg = mysql_real_escape_string($_GET['msg']);
echo "<div class=\"msg\">$msg</div><hr />";
}
if (isset ($_POST['Name'])){
$reusername = $_POST['Name'];}
else{$reusername = "NOTHING";}//to test
?>
<form action="index.php" method="post" >
<input name="UserName" type="text" size="30" value="<?echo $reusername;?>">
<input name="Email" type="text" size="30">
<input name="doSubmit" type="submit" value="submit">
</form>
}
您可以使用AJAX将表单数据提交到PHP脚本,并让它返回指定验证是否成功的JSON数据。这样,你的田地就不会被擦干净
另一种方法是将记录的参数发送回发布页面,并在发布页面中使用PHP填充字段
然而,我认为第一种解决办法更好
更新
编辑使你的代码更清晰,所以我注意到了一些东西。您的输入字段在HTML中称为UserName
,但在PHP中指的是Name
。这可能就是它不起作用的原因。您的字段是否总是填充值NOTHING
?确保输入字段的名称与您在$\u POST
中使用的下标相同
此外,如果您有错误,也不需要重定向到另一个页面(使用页眉)。维护$errors
数组或变量,以便在同一页面中打印错误消息。但正如我前面提到的,使用JSON方法可能更好,因为这样可以将视图层(html)与PHP(控制器层)分开。因此,您可以将HTML放在一个文件中,将PHP放在另一个文件中。EDIT:
Vivin评论说我关于标题的假设是不正确的,他在这方面是正确的。更进一步,OP所做的看起来基本上就是我在下面展示的内容,尽管是以一种不太结构化的方式。进一步Vivin-发现这里可能存在的实际问题-html名称和数组键$\u POST不匹配
因为您正在使用标题
重定向到另一个页面,所以它被清除了。通常,您会有一个单独的页面来验证数据,如果ok对数据进行了处理并返回某种类型的成功视图,或者返回一个错误视图,直接再次显示表单。使用标题
实际上是将浏览器重定向到另一个页面(即启动一个全新的请求)
例如:
//myform.php
if(strtolower($_SERVER['REQUEST_METHOD']) == 'get')
{
ob_start();
include('form.inc.php'); // we load the actual view - the html/php file
$content = ob_get_clean();
print $content; // we print the contents of the view to the browser
exit;
}
elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post')
{
$form = santize($_POST); // clean up the input... htmlentities, date format filters, etc..
if($data = is_valid($form))
{
process_data($data); // this would insert it in the db, or email it, etc..
}
else
{
$errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form
ob_start();
include('form.inc.php'); // we load the actual view - the html/php file
$content = ob_get_clean();
print $content; // we print the contents of the view to the browser
exit;
}
}
因此,这假设您的form.inc.php
总是将错误消息的输出编码到其中-它只是不显示它们。因此,在此文件中,您可能会看到如下内容:
<fieldset>
<label for="item_1">
<?php echo isset($error['item_1']) ? $error['item_1'] : null; ?>
Item 1: <input id="item_1" value="<?php echo $form['item_1'] ?>" />
</label>
</fieldset>
第1项:可以执行类似的操作,如果失败,那么value=$\u POST['value']
但维文的答案是最好的。我对AJAX了解不多,也无法管理它。好的,首先是标题(“Location:index.php?msg=$err”)代码>实际上不是必需的。最好的做法是不要在出错时像这样重定向,而是在同一页上显示错误。另外,像这样重定向意味着表单中的所有post数据都将丢失,因此永远无法将其打印回输入
您需要做的是:
<input name="Email" type="text" size="30" value="<?php print (!$err && $usr_email ? htmlentities($usr_email, ENT_QUOTES) : '') ?>">
您似乎正在处理表单所在页面上的帖子。这是一种很好的做事方式,它意味着你就快到了。如果验证成功,您所要做的就是重定向,但如果验证失败,则不必重定向。像这样
<?php
if( isset( $_POST['number'] ) ) {
$number = $_POST['number'];
// validate
if( $number < 10 ) {
// process it and then;
header('Location: success_page.php');
} else {
$err = 'Your number is too big';
}
} else {
$number = '';
$err = '';
}
?>
<form method="POST">
Enter a number less than 10<br/>
<?php echo $err ?><br/>
<input name="number" value="<?php echo $number ?>"><br/>
<input type="submit">
</form>
输入一个小于10的数字
你能提供一些关于它如何不工作的细节吗?+1-很好地抓住了html->php在字段名称中的差异。用户名混淆只是我把一些东西拼凑在一起。但你和大多数评论都回答了我的问题。