我是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
}
}
答案 0 :(得分:2)
你已经走在正确的道路上了。
查询SELECT COUNT(*) FROM users WHERE username = :username OR email = :email
可能是性能问题,因为db不能在此处使用任何索引。因此,您可能希望将其分为两个语句,一个用于用户名,另一个用于电子邮件。这也可以帮助您确定发生了哪个错误。
此外,您不需要在数据库中首先进行每次点击,因此limit 1
也很有用。