Php 密码正确,但同时密码不正确
因此,每当我登录并且密码正确时,就会显示 密码不正确。我该如何解决这个问题Php 密码正确,但同时密码不正确,php,mysql,Php,Mysql,因此,每当我登录并且密码正确时,就会显示 密码不正确。我该如何解决这个问题 <?php session_start(); require "php/dbc.php"; $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $enc_password = md5($password); if ($
<?php
session_start();
require "php/dbc.php";
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$enc_password = md5($password);
if ($username && $password) {
$query = mysql_query("SELECT * FROM login WHERE username='$username'");
$numrow = mysql_num_rows($query);
if ($numrow != 0) {
while ($row = mysql_fetch_assoc($query)) {
$db_username = $row['username'];
$enc_password = $row['password'];
}
if ($username == $db_username && $enc_password == $db_password) {
//echo "Logged in <a href='members.php'>Click here to enter the members area</a>";
$_SESSION['username'] = $db_username;
header("location: members.php");
} else {
header("location: top_nav.html?error=Incorrect Password");
}
} else {
header("location: top_nav.html?error=That user doesn't exist");
}
} else {
header("location: top_nav.html?error=All fields are required");
}
?>
您的错误在于如何获取和测试数据库存储的密码:
while ($row = mysql_fetch_assoc($query)){
$db_username = $row['username'];
$enc_password = $row['password']; // this should probably be $db_password
}
if ($username == $db_username && $enc_password == $db_password){
// this condition will be false as $db_password is null,
// and so not equal to $enc_password which is currently set to the database value
您的方法有点迂回-通常,我会查询用户名和加密的传入密码,而不是从数据库加载密码以供稍后测试
另外,您确实应该注意mysql库的PHP手册页面上的红色大框:
从PHP5.5.0开始,此扩展已被弃用,并将在中删除
未来。相反,应该使用MySQLi或PDO_MySQL扩展。
有关更多信息,请参见MySQL:选择API指南和相关常见问题解答
信息此功能的替代方案包括:
mysqli_连接
PDO::_构造
正如下面的评论中所提到的,您应该利用PDO和准备好的查询从使代码可读开始。请同意“无情”,如果代码在您的屏幕上看起来像那样,那么您需要对其进行大量清理。如果你在这里发布的时候把它弄坏了,也许你可以编辑它。它看起来只是一个弄坏了的粘贴。我试着尽我所能把它格式化。首先读一下:虽然我同意这个问题,但我不同意同时查询用户名和密码。这只是我的观点,但是如果有sql注入,在php中查询用户名和检查密码会更安全。如果同时查询用户名和密码,则最有可能假设resultset有效,如果sql注入强制查询回调其他行,则结果集可能无效。通过在php中检查密码,sql注入将返回多行,但php将检查密码,没有一行匹配。这只是我的观点,可能与pdo/mysqli存在争议。。。您最好使用PDO和准备好的语句。