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