我正在尝试检查输入的用户名是否已经存在,或者输入的用户名是否为当前用户名。
我已经在谷歌上搜索了各种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
}我如何才能让它检查用户名是否被占用,同时检查提交的用户名是否为当前用户名(如果是,让用户保存)?
发布于 2018-10-17 23:06:47
实际上,您的代码中有几个问题。
1)您的SQL。您可以在这里获取多个行,例如,您的数据库中有两个条目:username: maio290, e-mail: a@foo.bar和username: maio291, e-mail: b@foo.bar。现在,您的用户输入用户名:maio290和电子邮件:b@foo.bar,这将导致选择两个条目。很可能是边缘情况,但也是有效的。
2)你的if:你在比较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
}
}
?>https://stackoverflow.com/questions/52857174
复制相似问题