是否可以使用mysql中的in子句在多个列中搜索一个值


is it possible to search a value in multiple columns using in clause in mysql?

我想知道是否可以使用列名与元素相同的in子句在列中搜索值。例如:

$username_or_mail = 'value';
select * from users where $username_or_mail in(username,email);

其中username和email是表users中的列名
我试过了,看起来很有效,但我想确定我是否是对的。

假设您在"输入您的用户名或电子邮件地址和密码以登录"登录表单中使用此选项是否正确?

如果是这样,那么您的SQL代码是正确的,但暗示了一个可能的设计缺陷:如果某人的用户名也是另一个用户的电子邮件地址,会发生什么?这可能被用作恶意攻击(即通过使您的用户名等于受害者的电子邮件地址来劫持另一个用户的帐户)。

有一个解决方案/解决方法:只需检查'@'字符,并确保电子邮件地址包含@,同样也确保没有用户名包含@

如果您要执行该逻辑,那么您还可以优化SQL并跳过检查多列(psuedocode):

if( $usernameOrEmail contains '@' ) {
    registerParameter("@email", $usernameOrEmail);
    $sql = "SELECT ... WHERE EmailAddress = @email"; // note that "@email" is the syntax for query parameters in MySQL.
} else {
    registerParameter("@userName", $usernameOrEmail);
    $sql = "SELECT ... WHERE UserName = @userName";
}