我正在尝试检查输入的用户名是否已经存在,或者输入的用户名是否为当前用户名。
我已经用Google搜索了各种SO问题,但似乎没有人检查当前用户名是否为提交的用户名。
以下代码存在问题;不管是否使用用户名都无关紧要,它仍然可以让您保存。
$stmt = $engine->runQuery("SELECT user_name, user_email FROM users WHERE user_name=:username OR user_email=:email");
$stmt->execute(array(':username'=>$username, ':email'=>$email));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if(strtolower($row['user_name']) == strtolower($username) || $username !== $row['user_name']) {
$engine->authapi(false, 'Sorry, username is already taken. Please choose a different one.');
} elseif(strtolower($row['user_email']) == strtolower($email) && $email !== $_SESSION['user_email']) {
$engine->authapi(false, 'Email is already registered. You cannot use the same emails for multiple accounts.');
} else {
// save
}
我如何做到这一点,以便它检查用户名是否已被使用,同时检查提交的用户名是否为当前用户名(如果是,请让用户保存)?
答案 0 :(得分:0)
实际上,您的代码中存在几个问题。
1)您的SQL。您可以在此处获取多个行,例如,数据库中有两个条目username: maio290, e-mail: a@foo.bar
和username: maio291, e-mail: b@foo.bar
。现在,您的用户输入用户名:maio290
和电子邮件:b@foo.bar
,这将导致选择两个条目。最有可能是边缘情况,但有效的情况。
2)您的情况是否:您正在比较strtolower($row['user_name']) == strtolower($username)
或$username !== $row['user_name'])
-第二个错误与您的错误没有任何关系。因为这意味着:“嘿,您的用户不在我们的数据库中,请使用其他用户。”另外,使用strcasecmp
可以使第一次比较好得多。
我真的会把这两个选项分开,因为它要好得多,而且两个可选行也没有问题。另外,您让数据库处理比较。
因此,我将这样编写代码:
<?PHP
// Select if username is taken
$stmt = $engine->runQuery("SELECT user_name FROM users WHERE user_name=:username");
$stmt->execute(array(':username'=>$username));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if(count($row) != 0)
{
$engine->authapi(false, 'Sorry, username is already taken. Please choose a different one.');
// I would actually return here, so we wouldn't need an else
}
else
{
// check if e-mail is registred
$stmt = $engine->runQuery("SELECT user_email FROM users WHERE user_email=:email");
$stmt->execute(array(':email'=>$email));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if(count($row) != 0)
{
$engine->authapi(false, 'Email is already registered. You cannot use the same emails for multiple accounts.');
}
else
{
// store
}
}
?>