【问题标题】:PHP - MYSQL - Check password for a specific username if username exists [duplicate]PHP - MYSQL - 如果用户名存在则检查特定用户名的密码[重复]
【发布时间】:2017-10-25 01:39:56
【问题描述】:

我有一个我正在尝试解决的项目的登录名。我已经通过 POST(通过 AJAX 调用)获得了一个值,我已经检查了输入的用户名是否存在并且直到那里,它运行良好。但是知道我想检查密码是否对该用户名有效。这是 PHP 代码:

<?php

    //File with the conection data
    include_once "../conexion.php";

    //Initialization
    $user = "";
    $password = "";
    $errors = "";
    $result = "";
    $result2 = "";

    //Some validations (I've edited a little to make it shorter)
    if((isset($_POST['user'])) && (!empty($_POST['user']))){
        $user = $_POST['user'];
    }else{
        $errors .= "blablablah";
    }

    if((isset($_POST['password'])) && (!empty($_POST['password']))){
            $password = $_POST['password'];
        }else{
            $errors .= "blablabla";
        }

    //I make the query
    $sql = "SELECT user FROM users WHERE user = ?";

    //I prepare the query
    if($stmt = $con->prepare($sql)){

         $stmt->bind_param('s', $user);
         $result = $stmt->execute();

    }

    /* UP TO HERE, if I check that $result is true and echo "User exists" or something like that, IT WORKS, AS THE USER EXISTS */

    /* BUT now I want to check the PASSWORD, given that the user exists */

        if($result){

            //I make the query
            $sql2 = "SELECT user, password FROM users WHERE user = ? AND password = ?";

            //I prepare the query
            if($stmt2 = $con->prepare($sql2)){

                $stmt2->bind_param('ss', $user, $password);
                $result2 = $stmt2->execute();


                if($result2){
                    echo "ENTERED";
                }else{
                    echo "PASSWORD OR USER INCORRECT";
                }
            }

        } 

?>

我在 AJAX 调用的成功函数中使用了这些回显的结果,这是该代码(在表单的按钮中有一个 onClick 事件 (onClick="login()"),validationLogin( ) 具有字段的所有验证 --> 一切正常):

function login(){

if(validationLogin()){
        $.ajax({

                url: "http://localhost/myProject/extras/Login.php", 
                type: "POST",
                data: {"user": user, 
                       "password": password, 
                       },
                dataType: "html",
                cache: false,
                beforeSend: function() {    
                    console.log("Processing...");
                },
                success: 
                      function(data){

                        alert(data);
                        console.log(data);

                    }

    });

}else{
    //alert("Incorrect fields");
}

}

这返回 EMPTY,我提醒数据只是为了检查它有什么...提醒是空的,不明白为什么:/

我已经尝试过这个想法 --> PHP mySQL check if username and password are in the database 但在这种情况下它一直说它不正确:/

几点说明:

  • 我知道密码应该加密,以后可能会使用md5。
  • 通过使用 PHP 文件中的 echos 和 JS 文件中的 alert(data) / console.log(data),我只想检查 是否有效,以便继续。也许还有其他方法,更好的方法来做这一切,我知道,但我喜欢一点一点地进行
  • 我真的很想理解我的代码,然后会改进它,我真的很想了解它的功能和原因
  • 我想继续使用准备好的语句

提前感谢大家! :)

【问题讨论】:

  • 从不存储纯文本密码。您应该改用password_hash()password_verify()。如果您使用的是 5.5 之前的 PHP 版本,请不要使用 MD5 或 SHA1 来散列密码。相反,您可以使用this compatibility pack
  • @AlexHowansky 感谢您的提醒,我已经在帖子末尾提到了一些相关内容。
  • “我已经尝试过这个想法 --> PHP mySQL 检查用户名和密码是否在数据库中,但在这种情况下它一直说它不正确” - 我'那里有一个公认的答案(可以追溯到 2014 年),所以无论 OP 的问题的代码/答案之间存在什么差异,其他的东西都会让你失望。
  • 如果要检查行是否存在,使用num_rows,并绑定结果;并检查错误;你没有那样做。这就是你发布失败的原因。
  • 您不需要两个查询。进行一次查询以获取该行。如果它没有返回任何内容或密码匹配失败,则返回一般错误。尽量避免暴露不存在的用户和不正确的密码之间的区别。

标签: php mysql ajax database


【解决方案1】:

你应该试试这个:

$sql = "SELECT user,password FROM users WHERE user = ?";

//I prepare the query
if($stmt = $con->prepare($sql)){

     $stmt->bind_param('s', $user);
     $result = $stmt->execute();
     if ($result) {
         $stmt->bind_result($user_name,$password_db);    
     } else {
         $user_name="";
         $password_db="";
     }
    // Check Password
    if ($password==$password_db){
        /// PASSWORD IS OK
    }
}

现在您在 $user_name 中有用户,在 $password(如果存在)中有密码,因此您不需要第二条 sql 语句。在PHP函数中可以使用:

    data: {"user": <?php echo $user_name ?>, 
           "password": <?php echo $password_db ?> , 
           },

【讨论】:

  • 这不会比较密码值
  • @Martin 答案在一定程度上是正确的;只是不完全。
  • @Fred-ii- 是的,我开始写一个重新编码的答案(如果随后使用empty,则不需要isset),这将产生类似的影响。所以我应该把我的时间花在 SO 而不是 SE:代码审查上。修复别人的东西(免费:-/
  • @Martin 我每隔一段时间就会在问题中弹出该链接;它包含许多优秀的编码人员编写的大量代码。他们是一个教程,已经准备好了,可以大吃一惊了 ;-) 干杯
  • 不客气@xragdollqueen 看看我复制问题的链接;我看不到失败。如果它确实失败了,那么它会在你这边有一些事情要做。确保数据库中的数据正确,并且没有引入空格。我已经看到发生了很多次,只是让某人的一天变得糟糕。到处使用错误检查;通过开发者控制台、php 和 mysql;你会明白的,我确定 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多