php - 为什么我的 MySQL 查询在 PHP 条件检查之前执行?

标签 php mysql conditional-statements

我正在学习创建条件事件,其中在插入数据之前存在 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/

相关文章:

MySql 插入值或增加字段

ruby - 我可以在 Ruby 的下一行放置一个 if/unless 子句吗?

没有 cookie 的 PHP session

php - 最近在 ubuntu 16.04 上使用 php 7 到同一服务器的完整 url 的 file_get_contents 非常慢

php - 如何使用phpmyadmin在数据库中插入图像?

php - WAMP - phpMyAdmin [错误 #2002]

Perl 切换语句

php - jquery.post 不创建 session

PHP 检查重复证书号 MySQL 表

javascript - 如何使用 codeigniter 对 vehicle_number 和日期进行表单验证/数据限制