【发布时间】: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