0

我一直在尝试自己解决这个问题,但我终生无法解决它..

//If they are, retreive them from the Person table    
var_dump($_POST['username']);
var_dump($_POST['password']);
$select = $this-> doQuery("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '".md5($_POST['password'])."'");
var_dump($select);  

try {    
    if (mysqli_num_rows($select) > 0){
        var_dump(mysqli_num_rows($select));
        //fetching username and password from database
        $fetch_array = mysqli_fetch_assoc($select);
        var_dump($fetch_array);     
        //Building a session for the user
        $_SESSION['username'] = $fetch_array['username'];

        //var_dump($_SESSION['username']);

        //Redirecting the user to the index page        
        header('Location:index.php');
        return true;
    }

第 4 行和第 5 行的用户名和密码上的两个 var_dump 返回以下内容:

string(8) "johnny03" 
string(9) "password3" 
object(mysqli_result)#3 (5) { ["current_field"]=> int(0) ["field_count"]=> int(8) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } 

我为密码和用户名输入的值都是有效的(它们在数据库中正确的列下,相信我)。我感觉我的选择查询出了点问题,因为 mysqli_num_rows($select) 上的 var 转储没有返回任何内容。话虽如此,我已经尝试了几乎所有我能想到的查询更改它有效,但仍然没有:[有人可以帮忙吗?

4

2 回答 2

1

首先:尝试从查询中删除大括号:

$select = $this-> doQuery("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '" . md5($_POST['password']) . "'");

编辑:大括号没问题,请参阅draw010的评论。

如果这不是问题,正如 draw010 所指出的,请检查您的结果哈希(使用简单的回显将其输出并将其与您的数据库进行比较。

如果这些看起来确实匹配,但缺少一块,则调整数据库中密码字段的容量。

您的密码字段很可能有一个大小,例如 varchar(20),它太小而无法容纳整个散列。调整数据库中的大小并存储正确的散列结果

另外,至少看看一些盐渍,md5 已经被破坏了一段时间,所以你应该用 sha 系列的哈希替换它。

您也可以使用在线 md5 散列验证数据库中的散列,并通过使用 strlen 测量它来获取长度

于 2012-11-07T22:36:09.980 回答
0

试试这个:

var_dump("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '".md5($_POST['password'])."'");

它将转储查询。您应该能够立即找出任何明显的错误。如果查询看起来不错,请尝试将其复制并粘贴到 PHPMyAdmin(或类似)中以测试查询。如果它也返回零行,那么用户/密码可能不匹配?

于 2012-11-07T22:41:33.163 回答