【问题标题】:Check if username/email available method检查用户名/电子邮件是否可用方法
【发布时间】:2014-06-16 09:51:17
【问题描述】:

我尝试制定一种安全的方法来检查用户名或电子邮件是否未被使用,但我不确定这是否是正确的方法。我怎样才能做得更好?

private function checkAvailability() {
        try {
            $conn = new PDO(DB_SERVER, DB_USER, DB_PASS);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = ("SELECT COUNT(*) FROM users WHERE username = :username OR email = :email");
            $st = $conn->prepare($sql);
            $st->bindValue(":username", $_POST["username"], PDO::PARAM_STR);
            $st->bindValue(":email", $_POST["email"], PDO::PARAM_STR);
            $st->execute();
            if($st->fetchColumn() > 0) {
                $sql = ("SELECT COUNT(*) FROM users WHERE username = :username");
                $st = $conn->prepare($sql);
                $st->bindValue(":username", $_POST["username"], PDO::PARAM_STR);
                $st->execute();
                if($st->fetchColumn() > 0) {
                    throw new Exception("That username is already taken");
                } else {
                    throw new Exception("That e-mail is already registered.")
                }
                return 0;
            } else {
                return 1;
            }
            $conn = null;
        } catch (PDOException $e) {
            echo "Database error: " . $e->geMessage();
        } catch (Exception $e) {
            echo "Registration failed: " . $e->geMessage();
        }
    }

    public function registerUser() {
        if(self::checkAvailability) {
            // register user
        }
    }

【问题讨论】:

  • 为什么要从数据库中取数据两次?只需检查一次,如果有记录显示一条消息:“该用户名或电子邮件地址不可用。”我还建议不要使用异常来指示此消息,因为这是系统的正常非异常逻辑条件。从函数中返回某种状态会更好。
  • “某事”比“无”好。你尽力而为。这不是一个愚蠢的问题..

标签: php mysql sql pdo registration


【解决方案1】:

你已经在正确的道路上。

查询SELECT COUNT(*) FROM users WHERE username = :username OR email = :email 可能是性能问题,因为数据库不能在此处使用任何索引。因此,您可能希望将其拆分为两个语句,一个用于用户名,另一个用于电子邮件。这也将帮助您确定发生了哪个错误。

此外,您不需要数据库中的每一次点击都是第一次,所以limit 1 也很有用。

【讨论】:

  • 同意,但我只想指出 MySQL 可以 使用该查询的索引。如果emailusername 都被索引VARCHAR 那么查询应该使用index_merge 和联合。请参阅EXPLAIN 和 MySQL 参考手册。将查询分成两部分可能会使事情变得更快,并且肯定会更容易确定发生了哪个错误。
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2011-12-02
相关资源
最近更新 更多