在同一页面上显示PHP登录错误?

时间:2015-10-17 21:18:34

标签: php html css

我有两页。 Index.php和我的Login.php。

我正在使用下拉菜单表单登录 - 当用户按下“登录”时,数据将被发送到Login.php。当密码/用户名正确时(它们会被发送到仪表板),这一切都没问题。

但是我怎么能在表格中显示错误呢?目前,当用户名/密码错误时,它会将您发送到新的空白页面。我希望错误出现在表单上。

我的表格:

<div class="form-group">
   <label class="sr-only" for="username">Username</label>
   <input type="text" class="form-control" name="user_name" placeholder="Username" required>
</div>
<div class="form-group">
   <label class="sr-only" for="password">Password</label>
   <input type="password" class="form-control" name="user_password" placeholder="Password" required>
</div>
<div class="checkbox">
   <label>
   <input type="checkbox"> Remember me
   </label>
</div>
<div class="form-group">
   <button type="submit" class="btn btn-success btn-block">Sign in</button>
</div>

我的login.php:

error_reporting(E_ALL);

session_start();
$con = mysqli_connect("localhost", "root", "", "battlesql");

if (!$con) {
    echo "<div>";
    echo "Failed to connect to MySQL: ".mysqli_connect_error();
    echo "</div>";
} else {
    if (isset($_POST['user_name']) && isset($_POST['user_password'])) {

        $username = stripslashes($username);
        $username = mysqli_real_escape_string($con, $_POST['user_name']);

        $pass = stripslashes($pass);
        $pass = mysqli_real_escape_string($con, $_POST['user_password']);

        $pass_hashed = hash('whirlpool', $pass);

        $select_user = "SELECT * from accounts where name='$username' AND password='$pass_hashed' LIMIT 1";
        $query = mysqli_query($con, $select_user);

        $row = mysqli_num_rows($query);

        if (!$row) {
            echo "<div>";
            echo "No existing user or wrong password.";
            echo "</div>";
        } else {
            echo "<div>";
            echo "You have been logged in.";
            echo "</div>";
        }

    } else {
        echo "MySQL error!";
    }
}

3 个答案:

答案 0 :(得分:1)

在您的login.php中,不要回显“没有现有用户或密码错误”,请使用:

if(!$row)
      {
          die(header("location:index.php?loginFailed=true&reason=password"));
      }

在index.php中,您可以生成以下消息:

<button type="submit" class="btn btn-success btn-block">Sign in</button>
<?php $reasons = array("password" => "Wrong Username or Password", "blank" => "You have left one or more fields blank."); if ($_GET["loginFailed"]) echo $reasons[$_GET["reason"]]; ?>

答案 1 :(得分:0)

您可以使用ajax(asynchronous JavaScript and XML)实现所需目标。使用login.php电话从index.phpajax发送登录数据。阅读ajax调用返回的回复并显示错误/成功消息。

您可以使用jquery $.ajax({});函数来实现此模型。如果您在实施$.ajax()功能时遇到问题,那么您可以阅读所有相关内容 here

此外,如果您还没有这样做,我建议您在发送密码encrypt之前login.php

答案 2 :(得分:0)

有很多方法可以做到这一点,但我会为你提供一个。

查看您的PHP代码,我不确定您重定向到&#34;仪表板的位置&#34;是的,但是你说你有这样的代码:

<?php

//Fetch stuff from the database
if($fetchedUsername == $username and $fetchedPassword == $password)
{
    header("Location:/dashboard");
    return;
}

?>

然后,要将它们发送回登录表单,您只需在else语句中添加一些内容:

<?php

if(........)
{
    //Redirect to dashboard
}
else
{
    header("Location:/login");
    return;
}

?>

这会将它们发送回表格。现在你想显示一个错误,所以一种方法是设置一个GET变量,所以在else语句中,将标题改为:

header("Location:/login/?error=1");

这将让您检查登录页面上的错误代码。

所以登录页面代码。您可以使用isset()和内联PHP回声将错误直接打印到表单中。像这样:

<form>
    //Form stuff
    <?php if(isset($_GET["error"])):?>
        <div class="error">Invalid Username or Password</div>
    <?php endif; ?>
</form>

通过这种方式,您可以设置div.error样式,而无需担心在未设置$_GET["error"]时显示空包装。

您还可以使用内联PHP使代码回显更短:

<?=(isset($_GET["error"])) ? "Invalid Username or Password" : ""?>