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 - 如果用户名存在则检查特定用户名的密码[重复]的主要内容,如果未能解决你的问题,请参考以下文章