mysqli_num_rows = 0,应为1

时间:2012-11-07 22:19:34

标签: php mysql sql mysqli mysql-num-rows

我一直试图自己解决这个问题,因为我的生活无法解决它..

//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转储没有返回任何内容。话虽如此,我已经尝试了几乎所有我想到的查询更改它仍然有效:[有人可以帮忙吗?

2 个答案:

答案 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(或类似)中以测试查询。如果它也返回零行,那么用户/通行证可能不匹配?