【问题标题】:Database Username and Password in Delphi?Delphi中的数据库用户名和密码?
【发布时间】:2012-07-13 22:53:25
【问题描述】:

我想在 Delphi 中创建一种登录窗口。不幸的是,我无法让它与用户名和密码匹配。

我有一个基本的 .mdb 数据库,带有一个用户表。在此表中,有一个用户名和密码。我希望 Delphi 检查数据库中的用户名和密码,如果它与编辑框中的用户名和密码匹配,它会转到下一个表单或显示一条消息,否则它什么也不做。当我输入数据库的第一行,用户名和密码值时,我得到了成功,但是第二行,什么都没有。我觉得我需要一种方法让它移动到第二行值并检查这些值等等。数据库中目前也没有任何关系。

这是我的数据访问布局:ADOConnection -> ADOTable -> DataSource

提前致谢!

【问题讨论】:

  • 你能把你的表结构和你用来验证用户和密码的代码包括进来吗?
  • 你最好不要在数据库中存储纯密码,而是使用带有一些盐的哈希(例如用户名)...
  • 我知道 OP 可能认为你的 Hash with Some Salt 实际上是一些早餐食品,包括土豆。
  • 是的,使用带有盐的哈希函数是要走的路。您可以使用 md5 或 sha-1 功能。例如,它非常适合密码和信用卡号。

标签: delphi delphi-7


【解决方案1】:

根据您的猜测,一种解决方案是逐个记录移动以检查每一个记录。示例:

function MatchPass(Table: TADOTable; const Name, Pass: string): Boolean;
begin
  Result := False;
  Table.First;
  while not Table.Eof do begin
    if Table.FieldByName('Username').AsString = Name then begin
      Result := Table.FieldByName('Password').AsString = Pass;
      Exit;
    end;
    Table.Next;
  end;
end;

可以这样称呼:

  if MatchPass(ADOTable1, Edit1.Text, Edit2.Text) then
    ..


另一种解决办法是让ADOTable搜索对应的记录:

function MatchPass(Table: TADOTable; const Name, Pass: string): Boolean;
begin
  Result := Table.Locate('Username;Password', VarArrayOf([Name, Pass]), []);
end;

【讨论】:

  • 用一个sql语句不是更好吗?
  • @RRUZ - 我不确定其中一个是否具有显着优势。但是我们已经有了问题中给出的 ADOTable。
  • 感谢 Sertac!我没有理由使用 ADOTable,而不是 ADOQuery。那么出于好奇,SQL 语句会是什么样子?
  • @coder - 可能类似于“从 user = :Username 的密码中选择密码”,然后为用户名参数提供一个值并读取密码字段..
猜你喜欢
  • 1970-01-01
  • 2018-02-13
  • 2016-02-05
  • 2012-05-08
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多