Возвращаемые значения SQL в Delphi через ADO - PullRequest
2 голосов
/ 14 июля 2009

У меня есть эта функция, чтобы определить, существует ли пользователь в базе данных или нет

DM - мой DataModule

AQ_LOGIN ADOQuery

BENU - моя таблица, заполненная пользователями и их паролем

А вот и код:

function UserCheckExist(Login, pw: string): boolean;
begin
    with DM do
    begin
        AQ_LOGIN.Close;
        AQ_LOGIN.SQL.Clear;
        AQ_LOGIN.SQL.Add('select BLOGIN from BENU where BLOGIN = ''Login'' AND BPW = ''pw''');
        AQ_LOGIN.Open;
    end;
end;

Мой вопрос сейчас: Как сделать так, чтобы функция возвращала значение true или false, если пользователь с соответствующим паролем существует?

Заранее спасибо.

Ответы [ 6 ]

8 голосов
/ 14 июля 2009

Я бы пошёл с ответом smok1 (я просто публиковал что-то подобное), но я бы параметризовал ваши входные данные, таким образом;

AQ_LOGIN.SQL.Add('select count(*) from BENU where BLOGIN=:login and BPW=:pw');
AQ_LOGIN.Parameters.ParamByName('login').AsString:=login;
AQ_LOGIN.Parameters.ParamByName('pw').AsString:=pw;

тогда как с smok1 - откройте набор данных и посмотрите на значение возвращаемого счетчика.

Примечание: не иметь под рукой компонент ADO delphi, но на 99,9% уверен, что это синтаксис: -)

edit: одно из преимуществ использования таких параметров заключается в том, что вам не нужно очищать входные строки (например, в кавычках) - компонент знает, что делать с вашими строками. Вы не ожидаете, что у вас будет имя пользователя с одинарной кавычкой, но у вас может быть пароль с ним. : -)

3 голосов
/ 14 июля 2009
function UserCheckExist(Login, pw: string): boolean;
begin
    with DM do
    begin
        AQ_LOGIN.Close;
        AQ_LOGIN.SQL.Clear;
        AQ_LOGIN.SQL.Add('select BLOGIN from BENU where BLOGIN = ''Login'' AND BPW = ''pw''');
        AQ_LOGIN.Open;
        Result := (AQ_LOGIN.RecordCount > 0);
        AQ_LOGIN.Close;
    end;
end;
3 голосов
/ 14 июля 2009

Использование:

function UserCheckExist(Login, pw: string): boolean;
begin
  with DM do
  begin
    AQ_LOGIN.Close;
    AQ_LOGIN.SQL.Clear;
    {Use COUNT in select to determine if user exists}
    AQ_LOGIN.SQL.Add('select count(BLOGIN) from BENU where BLOGIN = ''Login'' AND BPW 'pw''');
    AQ_LOGIN.Open;
    Result:= (AQ_LOGIN.Fields[0].AsInteger = 1);
    AQ_LOGIN.Close;
 end;

конец;

Два изменения: во-первых, не выбирайте имя пользователя, лучше посчитать значения - COUNT всегда что-то возвращает, если пользователя нет - оно будет равно нулю Второе: вычислить результат, используя сравнение, если count (Fields [0], так как больше нет полей) равен единице. Если количество таких записей будет отличаться от одного, эта функция вернет false.

1 голос
/ 14 июля 2009

Вы можете проверить Eof.

function UserCheckExist(Login, pw: string): boolean;
begin    
  with DM do    
  begin        
    AQ_LOGIN.Close;        
    AQ_LOGIN.SQL.Clear;        
    AQ_LOGIN.SQL.Add('select BLOGIN from BENU where BLOGIN = ' + QuotedStr(Login) + ' AND BPW = ' + QuotedStr(pw));        
    AQ_LOGIN.Open;        
    Result := (not AQ_Login.Eof);
    AQ_LOGIN.Close;    
  end;
end;
0 голосов
/ 25 октября 2012

Поскольку вы используете компонент adoquery без подключения, я предполагаю, что база данных находится в системе или связанной сети. Компонент adotable настолько же безопасен, хотя люди всегда думают, что будет работать только sql .... используйте либо функцию adotable.locate, либо adoquery.locate, хотя поля таблиц нужно будет извлечь, прежде чем делать их небезопасными. Функция locate уже предотвращает внедрение со своими параметрами и возвращает логическое значение только в том случае, если оно найдено. Возможно, кто-то скажет, что это небезопасно. Я не знаю ваше приложение, но оно гораздо быстрее.

0 голосов
/ 14 июля 2009

Я добавил еще одну проверку, если пользователь активен. Но это не работает нормально.

function UserCheck(Login, pw: string): boolean;
  begin
    with DM do
    begin
        AQ_LOGIN.Close;
        AQ_LOGIN.SQL.Clear;
        AQ_LOGIN.SQL.Add('select COUNT(*) from BENU where BLOGIN = ''Login'' AND BPW = ''pw'' AND AKTIV = 1');
        AQ_LOGIN.Open;
        Result := (AQ_LOGIN.RecordCount > 0);
        AQ_LOGIN.Close;
    end;
end;

Здесь я использую функцию:

procedure TBenu_Login_Form.btnLoginClick(Sender: TObject);
  var pwhashed: string;
  begin
  pwhashed := MD5Print(MD5String(edtBPass.Text));
    if UserCheck(meBLogin.Text, pwhashed) then
      ShowMessage('User exists, Password is fine and active!')
    else
      ShowMessage('User does not exist, Password is wrong or not active!');
  end;

Хотелось бы знать, почему это не работает как намерение. Он всегда возвращает UserCheck true, никогда не false, когда я, например, введите несуществующее имя пользователя.

...