我正在学习创建条件事件,其中在插入数据之前存在 sql checkout 数据,这样它们就不会发生冲突。
我试过在 php 中使用 mysql 行检查,然后在我尝试验证查询是否正确执行之前检查查询是否为空。
还尝试在条件满足时关闭数据库连接,但无论如何它都没有值(value)。
$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。
最佳答案
您的主要问题是 $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()
。
关于php - 为什么我的 MySQL 查询在 PHP 条件检查之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57038600/