Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 密码正确,但同时密码不正确_Php_Mysql - Fatal编程技术网

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和准备好的语句。