0

我正在尝试做一个登录和注册脚本。我已经完成了大部分工作;但是,在我注册用户后,我无法以该用户身份登录。也就是说,注册用户无法登录。任何帮助将不胜感激!:)

这是与特定问题相关的代码:

$login = login ($username, $password);
        if ($login === false) {
         $errors [] = 'That username/password combination is incorrect';
        } else {
           $_SESSION ['user_id'] = $login;
           header ('Location: index.php');
           exit (); 
    }       


function  login ($username, $password) {
   $user_id = user_id_from_username ($username);

   $username = sanitize ($username);
   $password = md5($password);

return (mysql_result(mysql_query("SELECT COUNT(user_id) FROM users WHERE username =     '$username' AND password = '$password'"), 0) == 1) ? $user_id : false;
}

我之前像这样(下)写了上面的查询。以这种方式编写它允许我登录,但“字面上”使用任何密码。

function login ($username, $password){ 
  $user_id = user_id_from_username ($username);

  $username = sanitize ($username); 
  $password = sanitize ($password); 

  $query1 = mysql_query("SELECT COUNT(user_id) FROM users WHERE username =     '$username'"); 

 $query2 =  mysql_query("SELECT COUNT(user_id) FROM users WHERE password = '$password'"); 

 return  (mysql_result($query1, 0) == 1) ? $user_id : false; 
 return (mysql_result($query2, 0) == 1) ? $user_id : false;

也就是说,我将查询分为两部分,但注意到密码查询完全无关紧要(即使我“注释掉”了它)。

PS。我知道我应该使用 PDO 或 Mysqli 而不是 mysql 查询,而且 md5 并不那么安全。为了这个谜,请忽略这些事情。

4

1 回答 1

2

您确实应该以彻底处理查询结果的方式分解您的数据库查询操作。练习这样做。它将为您节省大量调试数据库查询问题的时间。

此外,这里不需要两次查询数据库(我假设这是您对user_id_from_username()函数调用所做的事情。只需完全摆脱它并设计您的查询以一次获取您需要的所有信息。

最后,您真的应该养成明确指定数据库连接的习惯。在这种情况下,我将数据库连接传递给函数。

把它们放在一起,你最终会得到这样的东西:

function  login ($username, $password, $db_conn) {
    $username = sanitize ($username);
    $password = md5($password);

    $query = "SELECT user_id FROM users WHERE username = '$username' AND password = '$password'";
    $result = mysql_query($query, $db_conn);

    if (false === $result) { // the query failed
        throw new Exception('Database failed with message: ' . mysql_error());
    }

    $rows = mysql_num_rows($result);
    if (0 === $rows) { // no record found
        return false;
    } else if ($rows > 1) { // too many records found.. really your DB indexes should disallow this
        return false;
    }

    $user_id = mysql_result($result, 0 , 'user_id');
    return $user_id;
}

当然,您已经提到您知道您应该使用 mysqli 或 PDO。我不能强烈地敦促你开始使用其中之一,因为 mysql 已被弃用,你会发现你必须尽快开始学习其中之一,所以你不妨现在开始。

于 2013-03-05T01:40:02.433 回答