Интересно, можно ли искать значение в столбцах, используя в предложении, имеющем имена столбцов, как в элементах.
например :
$username_or_mail = 'value';
select * from users where $username_or_mail in(username,email);
где имя пользователя и адрес электронной почты являются именами столбцов в таблице пользователей.
Я попробовал это, и кажется, что это работает, но я хочу быть уверен, что я прав.
Буду ли я прав, предполагая, что вы используете это для формы входа «Введите свое имя пользователя или адрес электронной почты и пароль для входа»?
Если это так, то ваш код 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";
}
Других решений пока нет …