我正在尝试检查电子邮件或密码是否已被占用。当我输入已采取的用户名时,它会说用户名已采取,如果我输入已采取的电子邮件,它会说电子邮件已采取,但如果我输入已采取的电子邮件和用户名,它会说“好”而不是“用户名和电子邮件已采取”。有谁知道为什么它不起作用?
$userSql = "SELECT * FROM members WHERE username='$username'";
$emailSql = "SELECT * FROM members WHERE email='$email'";
$result = mysql_query($userSql);
$result2 = mysql_query($emailSql);
$count = mysql_num_rows($result);
$count2 = mysql_num_rows($result2);
if (!empty($first_name) && !empty($last_name) && !empty($email) && !empty($username) && !empty($password)) {
if ($count != 1) {
echo "<p style=\"color: red\">Email taken, try another. You may already have an account</p>";
}
else if ($count2 != 1) {
echo "<p style=\"color: red\">Username taken, try another. You may already have an account</p>";
}
else if ($count != 1 && $count2 != 1) {
echo "<p style=\"color: red\">Username and email taken, try another. You may already have an account</p>";
}
else {
echo "<p>Good</p>";
}
Run Code Online (Sandbox Code Playgroud)
这真的很令人沮丧,因为我不知道为什么它不起作用。
您应该做的是在数据库中设置唯一用户名和电子邮件地址的约束。然后,尝试执行插入并在失败时捕获异常。否则,您可能会遇到几乎同时发生的用户尝试同时注册的情况,并且在您的 SELECT 和 INSERT 语句之间,用户名或电子邮件地址可能被其他人使用。
ALTER TABLE `members` ADD UNIQUE INDEX `email` (`email`);
Run Code Online (Sandbox Code Playgroud)
SQL 注入也有一个非常严重的问题。切勿将数据直接连接到查询中,否则可能会导致数据与命令混淆。数据必须被转义。处理此问题的正确方法是使用PDO 提供的准备好的/参数化的查询。