我正在学习在插入数据之前创建条件事件,其中存在sql checkout数据,以便它们不会冲突。
我尝试在php中使用mysql行检查,然后在尝试验证查询是否正确执行之前检查查询是否为空。
还尝试在条件满足时关闭数据库连接,但仍然毫无用处。
$user = addslashes(strtolower($usr));
$mail = addslashes(strtolower($mail));
$pass = md5(addslashes($pwd));
$check = $db->query("SELECT EXISTS(SELECT *
FROM `users`
WHERE LOWER(`username`) = LOWER('$user')
OR LOWER(`email`) = LOWER('$mail'))");
if (!$check) {
$db->close();
return false;
} else {
$sql = "INSERT IGNORE INTO `users` (`username`, `password`, `email`)
VALUES ('$user', '$pass', '$mail')";
$query = $db->query($sql);
$db->close();
return true;
}
我希望它在数据为空时执行查询,并在数据存在时返回false。
答案 0 :(得分:3)
您的主要问题是,$check
始终是真实值,只要查询永不失败。如果查询返回0行,则它仍然是真实的对象。
您应该检查是否返回任何值。鉴于MySQL不区分大小写,因此您还可以简化查询,并且不需要检查结果是否存在。使用准备好的语句,代码将如下所示
$stmt = $db->prepare("SELECT username FROM users WHERE username = ? OR email = ?");
$stmt->bind_param("ss", $usr, $mail);
$stmt->execute();
$check = $stmt->fetch();
$stmt->close();
// True if the user exists
if ($check) {
return false;
} else {
$stmt = $db->prepare(" INSERT INTO users (username, password, email) VALUES (?, ?, LOWER(?))");
$stmt->bind_param("sss", $usr, $pass, $mail);
$stmt->execute();
$stmt->close();
}
也就是说,您不应使用md5()
作为密码,而应将password_hash()
与password_verify()
一起使用。
答案 1 :(得分:0)
您可以像这样更改代码
$check = $db->query("SELECT EXISTS(SELECT * FROM `users`
WHERE LOWER(`username`) = LOWER('$user')
OR LOWER(`email`) = LOWER('$mail'))");
$check = $conn->query($sql);
$value = $check->fetch_row()[0];
if($value > 0 ){
echo "existed".$value; // you can change accordingly
}else{
echo "doesn't exist"; // this also
}
因为数据库以1表示存在,而0表示不存在,所以num_row始终为1,这就是为什么我们无法使用num_row确定存在的原因,所以我们必须获取值。