输入未通过strlen的验证测试

时间:2014-03-21 21:58:25

标签: php forms validation if-statement

我正在制作一个登录系统,我有一个表格经过验证。

然而,即使数据输入应该很容易通过,我的表单似乎也未能通过验证。

请参阅: 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;
        }
    }

3 个答案:

答案 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
}