检查用户名/电子邮件是否可用方法 - PHP,PDO

时间:2014-06-16 09:51:17

标签: php mysql sql pdo registration

我是PHP的新手。我尝试制作安全方法,检查是否没有使用用户名或电子邮件,我不确定这是否正确。所以我的问题是如何更好地做到这一点,或者如何做到熟练的程序员呢? 非常感谢

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
        }
    }

1 个答案:

答案 0 :(得分:2)

你已经走在正确的道路上了。

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

此外,您不需要在数据库中首先进行每次点击,因此limit 1也很有用。