【问题标题】:check password from database php [closed]从数据库php检查密码[关闭]
【发布时间】:2019-04-01 21:54:28
【问题描述】:

我正在尝试通过检查用户名和密码是否正确来从表 users 中获取特定行的一些数据。 我不明白为什么它不起作用!!

编辑:我插入整个页面的代码。我正在使用表单,因为我以相同的表单具有注册按钮和登录按钮。我正在检查用户按下了哪一个,然后执行操作。

$host = "xx";
$user = "xx";
$pass= "xx";
$dbname = "xx";
$conn = new mysqli($host,$user,$pass, $dbname );

if ($conn->connect_error) {
    die("Connection failed : ".$conn->connect_error); //fixme
}

if ( isset($_POST['login'])  ) {

    if ($_POST["actionb"] == 'Login') {

        $username = isset($_POST["username"]) ? $conn->real_escape_string($_POST["username"]) : "";
        $password = isset($_POST["password"]) ? $conn->real_escape_string($_POST["password"]) : "";

        echo $username;
        echo $password;
        $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
        $results=$conn->query($query);


        if (mysqli_num_rows($results) > 0 ) {
            $_SESSION['username'] = $username;
            if ($results->num_rows > 0) {
                // output data of each row
                while ($row = $results->fetch_assoc()) {
                    $email = $row["email"];
                    $postalcode = $row["postalcode"];
                    $phonenumber = $row["phonenumber"];
                }
            }
            $_SESSION['postalcode'] = $postalcode;
            $_SESSION['phonenumber'] = $phonenumber;
            $_SESSION['email'] = $email;
            echo "You are now logged in";
            header('location: confirm.php');
        } else {
            //echo "Wrong username/password combination";
        }
    }
}
?>

<html>
    <style type ="text/css">
        ...
    </style>

<body>

<form action="" method="post">
    <div class="header">
        <h1>For existing users</h1>
    </div>

    <input type="hidden" name="actionb" value="Login" >

    <label for="username"><b>Username</b></label>
    <input type="text" placeholder="Enter username" name="username" required>

    <label for="password"><b>Repeat Password</b></label>
    <input type="password" placeholder="Repeat Password" name="password2" required>

    <div class="clearfix">
        <button type="submit" name="login" value="Login">Login</button>
    </div>

</form>
</body>
</html>

【问题讨论】:

  • 什么不起作用?输出是什么?
  • 请停止存储纯文本密码,这是一种糟糕的做法,会危及您和您的用户。
  • 不断提示“错误的用户名/密码组合”; @user969068
  • 因为您可能在执行查询之前忘记连接mysql?您的代码中是否有具有正确凭据的 mysqli_connect?
  • @FunkFortyNiner 非常正确,我的回答中包含了您的评论

标签: php html mysql database session


【解决方案1】:

首先:就像@IdontDownVote 所说,在将密码存储到数据库之前,您应该始终(!)散列/加密密码(参见 php.net/manual/en/book.password.php)。一次黑客攻击,您的所有用户都会因为您不这样做而讨厌您。 ;)

第二:会不会是你得到了不止一排? (正如代码后面的if ($results-&gt;num_rows &gt; 0) { 所推测的那样。)该错误也会触发,因为您检查==1,可能会将其更改为&gt;0

第三:检查mysqli_query() 调用是否成功,方法是将其添加到您的if 语句中并使用$results &amp;&amp; mysqli_num_rows(..etc..

第四:密码实际发送为$_POST['password2']

第五:(正如@FunkFortyNiner 正确指出的那样)使用header() 作为重定向必须首先输出到浏览器(因此在此之前没有echo),然后是exit(); 以防止之后还有 echo-ing (这在 PHP 中也无效)。

第六:(正如@FunkFortyNiner 所指出的)在开发过程中,始终使用error_reporting(E_ALL | E_STRICT | E_NOTICE);ini_set('display_errors', 1); 在 PHP 的顶部。这样,所有错误、警告等都会显式打印在浏览器中,因此您可以调试/清理/修复。

【讨论】:

  • 没有任何效果,我尝试执行 echo $password 只是为了查看我是否获得了密码并且它没有回显任何内容@Philip
  • 那么 $_POST['password'] 未设置或为空。这是在表单发布之后吗?您能否提供问题中的表单代码?
  • 我添加了整页代码
  • 是的,在登录表单中,密码字段的名称是password2 而不是password,所以应该是$_POST['password2'](或更改输入的name
  • 不客气。上线前还是先看看其他问题吧;)
猜你喜欢
  • 2014-04-02
  • 2012-05-31
  • 2011-02-25
  • 2014-07-17
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2014-02-01
  • 2010-12-12
相关资源
最近更新 更多