我正在制作一个登录系统,我有一个表格经过验证。
然而,即使数据输入应该很容易通过,我的表单似乎也未能通过验证。
请参阅: http://marmiteontoast.co.uk/fyp/login-register/index.php
输入用户名时,应该超过3个字符。但即使您输入的时间很长,也会收到错误消息:用户名少于3个字符。
编辑:我的格式化复制导致丢失}。我已经纠正了这一点。这不是问题。
这是用户名传递的if语句。所以似乎没有超过第一次测试:
if (isset($_POST['username'])){
$username = mysql_real_escape_string(trim($_POST['username']));
$_SESSION['status']['register']['username'] = $username;
if(strlen($username) > 3){
if(strlen($username) < 31){
if(user_exists($username) === true){
$_SESSION['status']['register']['error'][] = 'That username is already taken. Sorry, please try again with a different username.';
}else{
// passed
}
} else {
$_SESSION['status']['register']['error'][] = 'The username is greater than 30 characters.';
}
} else {
$_SESSION['status']['register']['error'][] = 'The username is less than 3 characters.';
}
} else {
$_SESSION['status']['register']['error'][] = 'The username is not entered.';
}
这是用户名的HTML:
<form method="post" action="register.php">
<div class="username">
<label class="control-label" for="inputUser">Username</label>
<input type="text" id="inputUser" name="username" placeholder="Username" value="<?php echo $usern_value; ?>" />
</div>
您可以在此处查看该网站:http://marmiteontoast.co.uk/fyp/login-register/index.php
会话
索引页面确实使用会话。
从这开始:
<?php
session_start();
?>
并在文件末尾杀死会话:
<?php
unset($_SESSION['status']);
?>
但是在文件中它启动了存储输入的新会话。如果你犯了错误就是这样,它仍然保留你的信息,所以你可以调整它,而不是再次填写表格。这是一个示例,它抓取用户名并保存,然后输出。
<?php
if(isset($_SESSION['status']['register']['username'])){
$usern_value = $_SESSION['status']['register']['username'];
} else {
$usern_value = "";
}
?>
value="<?php echo $usern_value; ?>" />
这是user-exists
函数:
function user_exists($username){
$sql = "SELECT `id` FROM `users` WHERE `username` = '".$username."'";
$query = mysql_query($sql);
$result = mysql_num_rows($query);
if($result == 1){
// username does already exist
return true;
}else{
// username doesn't exist in the database
return false;
}
}
答案 0 :(得分:1)
啊,我可以从您的网站链接中看到问题。弹出错误(&#34;用户名少于3个字符。&#34;)时,请尝试刷新浏览器。我希望收到一个浏览器警告,说明数据会重新提交给服务器 - 因为你的格式是post
- 但我没有。
那么,这是什么意思?这意味着在验证失败后,您将立即重定向回同一屏幕,并且 - 除非您使用会话保留此信息 - 否则您的$_POST
数据将会丢失。通常在使用这种形式的验证失败的情况下,您必须防止重定向并在post操作内呈现,这样可以保持用户的输入。只有在表单输入成功(即保存到数据和/或发送电子邮件)时才会出现重定向。
编辑:我应该在原帖中看到$_SESSION
。好的,所以策略是将事情写入会话,重定向而不管验证结果如何,并将错误消息保存到会话中。我想知道你在发布表单时是否没有重置会话错误数组?在您第一次if
之后,请尝试添加以下内容:
if (isset($_POST['username'])){
$_SESSION['status']['register']['error'] = array(); // New line
除非您有什么东西让会话忘记了您的错误,否则它们会被存储,直到您删除浏览器的Cookie。
答案 1 :(得分:0)
你在这一行错过了一个结束括号}
:
if(user_exists($username) === true){
} else{// **missed the closing brace before the else**
// passed
}
答案 2 :(得分:0)
为什么你的逻辑如此复杂?
if (strlen($username) < 3) {
// too short
} elseif (strlen($username) > 31) {
// too long
} elseif (true === user_exists($username)) {
// already registered
} else {
// passed
}