Php 可以在mysql中使用in子句在多个列中搜索一个值吗?

Php 可以在mysql中使用in子句在多个列中搜索一个值吗?,php,mysql,in-clause,Php,Mysql,In Clause,我想知道是否有可能使用in子句搜索列中的值,该子句的列名与in元素相同。 例如: $username_or_mail = 'value'; select * from users where $username_or_mail in(username,email); 其中用户名和电子邮件是表用户中的列名。 我尝试了这个,似乎它正在工作,但我想确定我是否正确。我是否正确地假设您将此用于“输入您的用户名或电子邮件地址和密码登录”登录表单 如果是这样,那么您的SQL代码是正确的,但提示了一个可能的设

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

$username_or_mail = 'value';
select * from users where $username_or_mail in(username,email);
其中用户名和电子邮件是表用户中的列名。

我尝试了这个,似乎它正在工作,但我想确定我是否正确。

我是否正确地假设您将此用于“输入您的用户名或电子邮件地址和密码登录”登录表单

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

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

…如果要执行该逻辑,那么最好优化SQL并跳过检查多列(伪代码):


SQL似乎是正确的,但我不确定这个方法是否有效。这意味着多个列将共享相同的值,这将是一个设计flaw@DarkBee我认为OP使用它作为共享相同操作数的多个
谓词的更具表现力的速记。这将用于“输入您的用户名或电子邮件地址”类型的登录表单,可接受其中一种。@实际上我有一个登录表单,用户可以在其中输入用户名或电子邮件进行登录,然后,我在“用户名”和“电子邮件”列中搜索该值,以检查用户是否试图使用其电子邮件或用户名登录。@DarkBee这很少见,但我发现这不一定是设计缺陷。它翻译成
,而不是我假设的
。@[DAi]()谢谢你的快速回答,是的,你是对的,我想要这个功能,关于恶意攻击:我还检查用户名或邮件旁边的用户密码。因此,我认为没有必要检查它是用户名还是电子邮件,我还是更喜欢你的逻辑,因为它优化了sql查询。@hussainfrotan听起来不错-我相信你已经先对这些密码进行了加密哈希和加密?@[Dai]()我只需md5密码,然后将其存储在数据库中就可以了?@hussainfrotan md5不安全,改用SHA-2。
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";

}