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

时间:2019-07-15 11:17:20

标签: php mysql conditional-statements

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

2 个答案:

答案 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确定存在的原因,所以我们必须获取值。