PHP - MYSQL - 如果用户名存在则检查特定用户名的密码[重复]

Posted

技术标签:

【中文标题】PHP - MYSQL - 如果用户名存在则检查特定用户名的密码[重复]【英文标题】:PHP - MYSQL - Check password for a specific username if username exists [duplicate] 【发布时间】: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,并绑定结果;并检查错误;你没有那样做。这就是你发布失败的原因。 您不需要两个查询。进行一次查询以获取该行。如果它没有返回任何内容或密码匹配失败,则返回一般错误。尽量避免暴露不存在的用户和不正确的密码之间的区别。 【参考方案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;你会明白的,我确定 ;-)

以上是关于PHP - MYSQL - 如果用户名存在则检查特定用户名的密码[重复]的主要内容,如果未能解决你的问题,请参考以下文章

php mysql用户登录显示用户存在

如果 $post 存在,PHP 基本回显

MySQL/PHP:无法从数据库中选择,但元素存在

[日常] MySQL数据库持久连接

从 PHP 查询 MySQL 错误:如果存在

PHP连接mysql验证用户名是否存在