我一直在尝试自己解决此问题,并且终生无法解决。
//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_dumps返回:
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 dump不会返回任何内容。也就是说,我已经尝试了对查询的所有更改它的工作,仍然没有:[有人可以帮助吗?
最佳答案
首先:尝试从查询中删除括号:
$select = $this-> doQuery("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '" . md5($_POST['password']) . "'");
编辑:大括号可以,请参阅drew010的注释。
如drew010所述,如果这不是问题,请检查生成的哈希值(使用简单的回显将其输出,并将其与数据库进行比较。
如果这些看上去确实匹配,但是缺少一部分,则调整数据库中密码字段的容量。
您的密码字段很可能具有例如varchar(20),对于整个散列而言太小而无法容纳。调整数据库中的大小并存储正确的散列结果。
另外,至少看到一些问题后,md5从现在开始已经被破坏了,因此您应该将其替换为sha系列的哈希值。
您还可以使用online md5 hashing验证数据库中的哈希,并使用strlen测量哈希以获取长度
关于php - mysqli_num_rows = 0时应为1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13279248/