我在确定如何在验证失败时保留用户数据时遇到问题。我对PHP有点新意,所以我可能在我的逻辑中犯了一些大错。
目前,如果验证失败,则清除所有字段并且$ _Post数据也将消失。
以下是一些代码,假设用户输入了无效的电子邮件,我希望保留名称字段。此代码无效。
<?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>
}
答案 0 :(得分:2)
您可以使用AJAX将表单数据提交到PHP脚本,并让它返回指定验证是否成功的JSON数据。这样,您的字段将不会被擦干净。
另一种方法是将记录的参数发送回发布页面,并在发布页面中使用PHP填充字段。
但是,我认为第一种解决方案更好。
<强>更新强>
编辑使您的代码更清晰,所以我注意到了一些东西。您的输入字段在HTML中称为UserName
,但您指的是PHP中的Name
。这可能就是它无法正常工作的原因。您的字段是否始终填充值NOTHING
?确保输入字段的名称和您在$_POST
中使用的下标是相同的。
此外,如果您有错误,则无需重定向到另一个页面(使用标题)。维护$errors
数组或变量以在同一页面中打印错误消息。但是就像我之前提到的那样,使用JSON方法可能更好,从那时起你可以将视图层(html)与PHP(控制器层)分开。因此,您将HTML放在一个文件中,将PHP放在另一个文件中。
答案 1 :(得分:1)
修改强>:
Vivin评论说我对header
的假设是不正确的,他是对的。更进一步看起来OP正在做的事情基本上是我在下面列出的,虽然结构不那么结构化。进一步的Vivin - 抓住了这里的实际问题 - html名称和数组键$ _POST不匹配。
由于您使用header
重定向到另一个页面,因此擦除了干净。通常你会有一个页面验证数据,如果确定对它做了什么,并返回某种类型的成功视图,或者返回一个错误视图,直接再次显示该表单。通过使用header
,您实际上将浏览器重定向到另一个页面(即启动一个全新的请求)。
例如:
// 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>
答案 2 :(得分:0)
可以执行类似于失败的操作然后返回值= $ _ POST ['value']
但是vivin的答案是最好的。我对AJAX了解不多,也无法管理它。
答案 3 :(得分:0)
好的,首先header("Location: index.php?msg=$err");
并不是真的需要。最好不要在出错时重定向,但在同一页面上显示错误。此外,重定向就像这样意味着您丢失了表单中的所有帖子数据,因此您永远不会将其打印回输入。
您需要做的是:
<input name="Email" type="text" size="30" value="<?php print (!$err && $usr_email ? htmlentities($usr_email, ENT_QUOTES) : '') ?>">
这里我正在检查是否存在任何错误,然后是否设置了$usr_email
变量。如果这两个条件都匹配,则后期数据将打印在字段的value属性中。
我使用函数htmlentities()
的原因是因为否则用户可以将恶意代码注入页面。
答案 4 :(得分:0)
您似乎正在处理与表单相同的页面上的帖子。这是一种做事的好方法,这意味着你几乎就在那里。如果您的验证成功,您所要做的就是重定向,但如果验证失败则不需要。喜欢这个
<?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>