Хранимая процедура при входе пользователя в SQLServer - PullRequest
0 голосов
/ 03 февраля 2010

Я пишу процедуру для входа в систему, где пользователь может также указать имя пользователя или адрес электронной почты для входа в систему и пароль. моя процедура такая

create procedure users_login (@username varchar(50),@password varchar(50),
  @emailid varchar(50),@ret int output)
as
  begin
       select username,password,emailid from users where username=isnull(@username,null) or
        emailid=isnull(@emailid,null) and [password]=@password
       if(@@rowcount >0)
          begin
                set @ret=1
          end
       else
           begin
               set @ret=0
            end
  end

все нормально или есть какая-то модификация

Ответы [ 2 ]

2 голосов
/ 03 февраля 2010

В самом запросе есть проблема, вам нужно заключить в скобки операторы or, иначе оператор всегда будет возвращать строку, когда имя пользователя совпадает в таблице:

SELECT username,password,emailid 
FROM users 
WHERE ( username=isnull(@username,null) or emailid=isnull(@emailid,null) )
      and [password]=@password

Во-вторых, вы не должны хранить пароли в виде открытого текста. Пожалуйста, прочитайте что-то вроде этой статьи о том, как подсолить и хэшировать ваши пароли

Что касается стиля, я бы лично так не поступил. Как уже отмечали другие, isnull () в этом случае аналогично тому, как не использовать его. Вы также можете сократить использование @@ rowcount, просто установив @ret в операторе select. Если он не возвращает строк, он не будет установлен, поэтому он достигнет того же конца.

Так что я бы написал так:

create procedure users_login (
                              @username varchar(50),
                              @password varchar(50),
                              @emailid varchar(50),
                              @ret int output
                             )
as
  begin
       set @ret=0
       select @ret=1 
       from users 
       where (username=isnull(@username,null) or emailid=isnull(@emailid,null) 
             and [password]=@password
  end
0 голосов
/ 03 февраля 2010

Я не гуру SQL, так может кто-нибудь, пожалуйста, скажите мне, что ...

isnull(@username,null)

... предназначен для достижения? Для меня это равнозначно @username



Это Transact-SQL? Не могли бы вы немного уменьшить SQL, используя синтаксис INSERT INTO для @ret и вставив COUNT возвращаемых строк?



Вы экранируете имя пользователя, адрес электронной почты и пароль хэширования с вашего сайта, прежде чем использовать его с SQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...