我一直试图自己解决这个问题,因为我的生活无法解决它..
//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转储没有返回任何内容。话虽如此,我已经尝试了几乎所有我想到的查询更改它仍然有效:[有人可以帮忙吗?
答案 0 :(得分:1)
首先:尝试从查询中删除大括号:
$select = $this-> doQuery("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '" . md5($_POST['password']) . "'");
编辑:大括号没问题,请参阅drew010的评论。
如果这不是问题,如drew010所述,请检查生成的哈希值(使用简单的echo输出并将其与数据库进行比较。
如果这些内容似乎匹配,但缺少某个部分,请调整数据库中密码字段的容量。
您的密码字段很可能有一个大小,例如varchar(20)太小而不适合整个哈希。调整数据库中的大小并存储正确的哈希结果 。
另外,至少看到一些腌制,md5已经被打破了一段时间,所以你 应该 用sha-family的哈希替换它。
您也可以使用online md5 hashing验证数据库中的哈希值,并通过使用strlen测量它来获取长度
答案 1 :(得分:0)
试试这个:
var_dump("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '".md5($_POST['password'])."'");
它会转出查询。任何明显的错误,你应该能够立即挑选出来。如果查询看起来很好,请尝试将其复制并粘贴到PHPMyAdmin(或类似)中以测试查询。如果它也返回零行,那么用户/通行证可能不匹配?