检查用户是否存在于数据库中的有效方法

Efficient way to check if user exists in database

我正在构建一个简单的查询来检查数据库中是否存在具有特定凭据的用户,如果存在则抛出错误。

    $user_exists_query = "SELECT COUNT(*) FROM users WHERE phone=:phone OR email=:email AND status=:status ";
    $check_user_exists = $conn->prepare($user_exists_query);
    $check_user_exists->bindValue(':phone', $phone, PDO::PARAM_STR);
    $check_user_exists->bindValue(':email', $email, PDO::PARAM_STR);
    $check_user_exists->bindValue(':status', $status, PDO::PARAM_STR);
    $check_user_exists->execute();

以上方法有效,但在某些情况下会失败,例如某些用户没有电子邮件地址并且该行为空但查询 returns 所有这些。我想要的是查询 returns 只有具有 phone 或符合条件的电子邮件的用户数。当行为空时不返回。我怎样才能得到这样的解决方案?

一个想法是在 PHP 中构建查询字符串以仅包含具有非空值的参数。

// define parameter array
$params = [];

// add trimmed values to parameter array
if (!empty($phone) && !ctype_space($phone)) {
    $params['phone'] = trim($phone);
}
if (!empty($email) && !ctype_space($email)) {
    $params['email'] = trim($email);
}

// build where statement from parameter array
$wheres = implode(' OR ',array_map(function($v){return "`$v`=:$v";},array_keys($params)));

// build full query
$user_exists_query = "SELECT COUNT(*) FROM users WHERE ($wheres) AND status=:status;";

// prepare statement
$check_user_exists = $conn->prepare($user_exists_query);

// bind parameter values
foreach ($params as $k => $v) {
    $check_user_exists->bindValue(":$k", $v, PDO::PARAM_STR);
}

// bind status value
$check_user_exists->bindValue(':status', $status, PDO::PARAM_STR);

// execute
$check_user_exists->execute();

另一种方法是在查询本身中排除空白值。

SELECT COUNT(*) FROM users WHERE 
  (
    (
      phone = : phone 
      AND phone != ''
    ) 
    OR (
      email = : email 
      AND email != ''
    )
  ) 
  AND status = : status