【问题标题】:Erlang and mysqlErlang 和 mysql
【发布时间】:2019-05-26 14:08:01
【问题描述】:

我在 mysql 中有一个用户表,其中包含 useridusernamepassword 等 使用 mysql-otp 我查询喜欢

select * from users where username = ?

它返回 ColumnNamesRows就像

[[38, <<"joe">>, <<"passwordhash">>..]]

假设我有一个哈希值要比较

Hash = "passhash".

作为我在 erlang 编码的第三天,我目前正在做/测试的是

[[_, _, UserPass, _,..]] = Rows.

将密码存储在UserPass中。

Pass = binary_to_list(UserPass).

然后我可以比较像

Hash == Pass.

这种方法是正确的还是我做错了? 必须有适当的方法从列表中的所谓列表中获取数据。

【问题讨论】:

    标签: mysql erlang


    【解决方案1】:

    必须有一种正确的方法从所谓的数据中获取数据 列表中的列表

    获取目标数据的正确方法是使用模式匹配来解构任何类型的集合包含您的数据。因为mysql-otp 返回与查询匹配的行列表,其中每一行本身就是一个列表,所以数据采用列表列表的形式。因此,为了匹配列表列表,您的模式也必须是列表列表。

    作为我在 erlang 编码的第三天,我目前正在做什么/测试 是

    [[_, _, UserPass, _,..]] = Rows.
    

    好极了。

    如果您知道mysql-otp 只会返回一行,或者您只对第一行感兴趣,您可以像这样简化模式:

    [_, _, UserPass, _, ...] = hd(Rows).
    

    hd 是 head 的简写,即列表的头部。或者,您可以像这样手动完成同样的事情:

    [FirstRow | _Tail] = Rows,
    [_, _, UserPass, _, ...] = FirstRow.
    

    =======

    另一种提取密码的方法:

    UserPass = lists:nth(3, hd(Rows)).
    

    【讨论】:

    • 由于用户名是唯一的,它应该只返回 1 行。
    • @user10844401, 您对下面这句话有什么不明白的地方:获取目标数据的正确方法是使用模式匹配 b> 解构包含您的数据的任何类型的集合。 但是,如果由于某种莫名其妙的原因您发现模式匹配令人讨厌,我发布了另一种获取数据的方法 - 请参阅我的答案的底部。跨度>
    猜你喜欢
    • 2017-12-29
    • 2017-10-07
    • 2011-04-01
    • 2022-01-14
    • 2011-07-25
    • 2012-02-28
    • 2017-12-20
    • 2010-12-28
    • 2011-07-01
    相关资源
    最近更新 更多