2

usersユーザーとパスワードのフィールドを持つ mnesia テーブルがあります。

私のテーブルからのデータ:

[{users, <<"user_name">>, <<"password">>}].

ユーザー名でパスワードを取得する必要があります。私が作る:

mnesia:dirty_read({users, <<"user_name">>}).

しかし、それは戻ります[]

ユーザー名でパスワードを取得するにはどうすればよいですか?

4

4 に答える 4

0

あなたは以下のようなことをすることができます:

YourPasswd = mnesia:ets(fun()-> mnesia:dirty_read({users、UserId})end)、

    ケースYourPasswdの
            []-> {エラー、'ユーザーが見つかりません'};
            [{users、_UserID、Passwd}]->
                {成功、Passwd}
    終わり。

データがmnesiaに正しく書き込まれることを願っています:)

于 2011-04-22T09:06:05.567 に答える
0

パスワードをできるだけ早くチェックしてほしいとのことですが、プロジェクトはこれを最適化する必要がある段階にありますか?

私は自分のプロジェクトの1つに認証モジュールを持っており、あなたと同じような目標を持っています。まだ最適化する機会がなかったので、ユーザー名とパスワードにmnsesiaトランザクションとリストを使用しています。

これが私の認証モジュールの一部です。

-module(auth).

-export([init/1, add_user/2, start_session/2]).
-record(auth_user, {username, password}).

init(Nodes) ->
    mnesia:create_table(auth_user,
        [{disc_copies, Nodes},
        {attributes, record_info(fields, auth_user)}]).

add_user(Username, Password) ->
    T = fun() -> 
    mnesia:write(#auth_user {
                username = Username,
                password = Password})
    end,
    mnesia:transaction(T).

start_session(Username, Password) ->
    T = fun() ->
        mnesia:read(auth_user, Username)
    end,
    {atomic, Ret} = mnesia:transaction(T),
    case Ret of
    [U] ->
        if (U#auth_user.password == Password) ->
            true;
        true ->
            false
        end;
    _Else ->
        false
    end.

erlangシェルをコンパイルして起動した後。

Eshell V5.8.3  (abort with ^G)
1> mnesia:create_schema([node()]).
ok
3> mnesia:start().
ok
4> auth:init([node()]).
{atomic,ok}
5> auth:add_user("rodericktaylor", "password").
{atomic,ok}
6> true = auth:start_session("rodericktaylor", "password").
true
7>

同じ問題が発生するかどうかを確認するために、バイナリ値に切り替えてダーティリードを実行しました。

start_session_dirty(Username, Password) ->
    case mnesia:dirty_read(auth_user, Username) of
    [U] ->
        if (U#auth_user.password == Password) ->
            true;
        true ->
            false
        end;
    _Else ->
        false
    end.

erlシェルの次のコマンドは、期待どおりに機能することを示しています。

12> auth:add_user(<<"rodericktaylor">>, <<"binarypassword">>).            
{atomic,ok}
14> true = auth:start_session_dirty(<<"rodericktaylor">>, <<"binarypassword">>).
true
15>

私が助けてくれたことを願っています。

于 2011-04-27T05:31:43.037 に答える
0

この関数を見てください:

-define(TABLE_NAME,ユーザー)。

get_password_by_username(ユーザー名)->
     F = fun(U)-> mnesia:read({?TABLE_NAME,U}) end,
     mnesia:activity(トランザクション,F,[ユーザー名],mnesia_frag).

それはあなたに結果を与えるでしょう。mnesia:activity/4 の良いところは、テーブルが断片化されていてもいなくても、答えは大丈夫だということです。幸運を

于 2011-04-22T12:13:01.233 に答える
0

使用しているレコード構文を指定していませんが、次のようになります

-record(ユーザー、{ユーザー名、パスワード})。

...または同様のもの。では、テーブルを作成したときに、ID を設定するために何か特別なことをしたとしますか? この例では、何か特別なことをしない限り、"username" (users レコードの最初のエントリ) がデフォルトで ID になります。

問題が解決しない場合は、mnesia:match_object/1 または /3 の使用を検討してください。パターン/レコード構文で、一致させる必要がある部分 (この場合はユーザー名) を指定し、=' ' を使用して、知らない、または気にしないもの (この場合はパスワード) と一致させます部分)。

それが役立つことを願っています!

于 2011-04-21T19:28:48.547 に答える