PHP中的用户名和密码问题

PHP中的用户名和密码问题,php,html,Php,Html,我试图用PHP创建一个登录表单,但它无法登录。我的密码/用户名不正确。我已经三次检查了数据库中的凭据,它们是正确的。请帮忙 这是密码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Login</title> <link rel="stylesheet" href="css/style.css" /> </head> <bo

我试图用PHP创建一个登录表单,但它无法登录。我的密码/用户名不正确。我已经三次检查了数据库中的凭据,它们是正确的。请帮忙

这是密码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Login</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<?php
     require('db.php');
     session_start();
     // If form submitted, insert values into the database.
     if (isset($_POST['username'])){
         $username = $_POST['username'];
         $password = $_POST['password'];
         $username = stripslashes($username);
         $username = mysqli_real_escape_string($connection,$username);
         $password = stripslashes($password);
         $password = mysqli_real_escape_string($connection,$password);
         //Checking is user existing in the database or not
         $query = "SELECT * FROM `backuser` WHERE username='".$username."' and password='".md5($password)."'";
         $result = $connection->query($query) or die(mysqli_error());
         $rows = mysqli_num_rows($result);
         if($rows==0){
             $_SESSION['username'] = $username;
             header("Location: index.php"); // Redirect user to index.php
         }else{
             echo " <div class='form'><h3>Username/password is incorrect.</h3><br/>Click here to <a href='login.php'>Login</a></div>";
         }
     }else{
?>
<div class="form">
<h1>Log In</h1>
<form action="" method="post" name="login">
<input type="text" name="username" placeholder="Username" required />
<input type="password" name="password" placeholder="Password" required />
<input name="submit" type="submit" value="Login" />
</form>
</div>
<?php } ?>
</body>
</html>

登录

你的逻辑有错误。将
if($rows==0)
更改为
if($rows!=0)
。如果用户在DB中,您应该至少返回1条记录,并且
mysqli_num_rows()
应该返回一个数字
=1
您的逻辑有错误。将
if($rows==0)
更改为
if($rows!=0)
。如果用户在DB中,您应该至少返回一条记录,并且
mysqli_num_rows()
应该返回一个数字
=1
似乎可以解决您的直接问题,但是我还建议:

  • 使用PHP内置函数(PHP5.5+和5.3)对密码进行哈希运算。MD5在密码方面不安全,不建议存储或检查密码

  • 如果您是PHP新手,那么它非常非常非常值得您在代码中探索使用。这将
    代码
    用户输入
    分开,从而大大降低了风险

  • 当您有一个重定向的
    头时,您应该立即使用
    exit
    语句跟随该头,因为在跟随头之前,其余的PHP代码仍将运行

        $_SESSION['username'] = $username;
         header("Location: index.php"); // Redirect user to index.php
         exit;
    
  • 不要在密码字段上使用文本编辑功能,如
    stripslashes()
    ,如果有人的密码中有斜杠,它将被删除,他们将无法登录。密码应该是任意字符,而不仅仅是a-z或0-9等

  • 对于
    MySQLi\uu
    [过程]错误报告,您需要提供连接详细信息:

    die(mysqli_error($connection));
    
    否则报告不会给你任何东西

  • PHP
    session\u start()
    应该在任何内容输出到浏览器之前,因此它需要位于PHP页面的最顶端。(多亏了尼廷,我才错过了这个)

似乎可以解决您眼前的问题,但我也建议:

  • 使用PHP内置函数(PHP5.5+和5.3)对密码进行哈希运算。MD5在密码方面不安全,不建议存储或检查密码

  • 如果您是PHP新手,那么它非常非常非常值得您在代码中探索使用。这将
    代码
    用户输入
    分开,从而大大降低了风险

  • 当您有一个重定向的
    头时,您应该立即使用
    exit
    语句跟随该头,因为在跟随头之前,其余的PHP代码仍将运行

        $_SESSION['username'] = $username;
         header("Location: index.php"); // Redirect user to index.php
         exit;
    
  • 不要在密码字段上使用文本编辑功能,如
    stripslashes()
    ,如果有人的密码中有斜杠,它将被删除,他们将无法登录。密码应该是任意字符,而不仅仅是a-z或0-9等

  • 对于
    MySQLi\uu
    [过程]错误报告,您需要提供连接详细信息:

    die(mysqli_error($connection));
    
    否则报告不会给你任何东西

  • PHP
    session\u start()
    应该在任何内容输出到浏览器之前,因此它需要位于PHP页面的最顶端。(多亏了尼廷,我才错过了这个)


问题在于我没有在数据库中分配足够的存储空间(字符长度)来存储哈希值。我将长度值调整为30,效果很好。

问题是我没有在数据库中分配足够的存储空间(字符长度)来存储哈希值。我将“长度”值调整为30,效果非常好。

说“了解语句”。即使是这样也不安全!您真的不应该使用PHP来处理密码安全性。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码并导致不必要的额外编码。启动基本调试:回显生成的查询并手动运行。从查询中删除pw检查,并在代码中执行此操作。您确定将pws存储为数据库中的md5哈希吗?否则,您正在执行的
'hunter2'==md5('hunter2')
将永远不匹配,返回零行。您所说的“让这家伙休息一下”是什么意思?这些评论相当无害,非常有用@NathanRobb这里的代码不应该在生产中使用,可能会被认为是危险的。@NathanRobb:另外,由于他只是在学习,所以最好从一开始就教他以正确的方式做事。表示了解的语句。即使是这样也不安全!您真的不应该使用PHP来处理密码安全性。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码并导致不必要的额外编码。启动基本调试:回显生成的查询并手动运行。从查询中删除pw检查,并在代码中执行此操作。您确定将pws存储为数据库中的md5哈希吗?否则,您正在执行的
'hunter2'==md5('hunter2')
将永远不匹配,返回零行。您所说的“让这家伙休息一下”是什么意思?这些评论相当无害,非常有用@NathanRobb这里的代码不应该用于生产,可能会被认为是危险的。@NathanRobb:而且因为他刚刚开始学习,最好从一开始就教他正确做事。@JayBlanchard很遗憾,我没有OP的源代码和DB转储。在我看来,帮助他的唯一方法就是说明代码中明显的逻辑错误。广告解释:我在建议修复后立即解释了原因。@sarasvati尝试了,但不幸的是没有任何改变。@Ja