我正在尝试登录和注册脚本。我成功完成了大部分工作;但是,在我注册用户后,我无法以该用户身份登录。也就是说,注册用户无法登录。任何帮助都将受到大力赞赏! :)
这是与特定问题相关的代码:
$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不是那么安全。为了这个谜题,请忽略这些东西。
答案 0 :(得分:2)
您真的应该以一种彻底处理查询结果的方式分解数据库查询操作。参与这样做的实践。它将为您节省大量调试数据库查询问题的时间。
此外,这里不需要两次查询数据库(我假设您正在使用user_id_from_username()
函数调用。只需完全摆脱它并设计查询以获取所需信息一下子。
最后,您应该养成明确指定数据库连接的习惯。在这种情况下,我将DB连接传递给函数。
总而言之,你最终会得到类似的东西:
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已被弃用,你会发现你必须尽快开始学习其中一个,所以你现在也可以开始。