准备好的语句,用于测试用户名或密码错误的字段

时间:2013-12-06 16:42:12

标签: php mysql mysqli

检查记录是否与WHERE匹配是很常见的。但是我想知道今天早上是否有可能发现你是否有部分匹配。如果是这样,哪一个是正确的哪个是错的?因此user_name可能是正确的,但不是电子邮件地址。

有没有办法在不做两个不同的查询语句的情况下做到这一点?这是我的开始代码。建议?

  $query = "SELECT user_name, user_email FROM user_list WHERE (user_name = ?) AND (user_email = ?)";
  $stmt = mysqli_prepare($link, $query);
  mysqli_stmt_bind_param($stmt, 'ss', $username, $email);

  if ($result = mysqli_stmt_execute($stmt)); 
    {
      mysqli_stmt_bind_result($stmt, $db_username, $db_email);
      $got_match = mysqli_stmt_fetch($stmt);    
      } 

如果答案采用程序方法,我会很感激。 : - )

1 个答案:

答案 0 :(得分:3)

首先,您需要在where子句中使用OR条件进行部分匹配:

WHERE user_name = ? OR user_email = ?

其次,您需要在select中添加一些CASE语句(或IF语句,如果您愿意)以确定哪些项匹配:

SELECT
  user_name,
  (CASE WHEN user_name = ? THEN 1 ELSE 0 END CASE) AS user_name_match,
  user_email,
  (CASE WHEN user_email = ? THEN 1 ELSE 0 END CASE) AS user_email_match

所以把它们放在一起

SELECT
  user_name,
  (CASE WHEN user_name = ? THEN 1 ELSE 0 END CASE) AS user_name_match,
  user_email,
  (CASE WHEN user_email = ? THEN 1 ELSE 0 END CASE) AS user_email_match
FROM user_list
WHERE user_name = ? OR user_email = ?

请注意,您需要绑定到所有4个参数。

正如其他人在上面的评论中指出的那样,如果你的意图是告诉最终用户只有user_name或user_email匹配,从安全的角度来看,这可能不是一个好主意。