PHP-检查用户名是否存在或提交的用户名是否为最新

时间:2018-10-17 14:20:33

标签: php sql

我正在尝试检查输入的用户名是否已经存在,或者输入的用户名是否为当前用户名。

我已经用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
}

我如何做到这一点,以便它检查用户名是否已被使用,同时检查提交的用户名是否为当前用户名(如果是,请让用户保存)?

1 个答案:

答案 0 :(得分:0)

实际上,您的代码中存在几个问题。

1)您的SQL。您可以在此处获取多个行,例如,数据库中有两个条目username: maio290, e-mail: a@foo.barusername: 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
    }

}
?>