使用电子邮件或电话号码进行身份验

时间:2015-03-15 13:15:54

标签: c# mysql

我有一个登录页面。我想使用Username部分中的电子邮件地址或电话号码对用户进行身份验证。

我使用以下方法:

public Customer Authenticate(string uname, string pass)
        {
            string query = "select * from tblCustomer where (Username=@email OR Username=@phone) and Password=@pass ";

            List<SqlParameter> lstP = new List<SqlParameter>();

            lstP.Add(new SqlParameter("@uname", uname));
            lstP.Add(new SqlParameter("@pass", pass));

            DataTable dt = DBUtility.SelectData(query, lstP);

            if (dt.Rows.Count == 0)
            {
                return new Customer();
            }
            else
            {
                return SelectByID(Convert.ToInt32(dt.Rows[0]["CustomerID"]));
            }
        }

现在在这个方法中如何添加第3个参数?即phone number

任何想法我应该如何去做? P.S。:我使用的是3层架构

以下是SelectData所需的代码:

public static DataTable SelectData(string query, List<SqlParameter> lstParams)
        {
            SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|MyDB.mdf;Integrated Security=True");

            SqlCommand comm = new SqlCommand(query, conn);
            comm.Parameters.AddRange(lstParams.ToArray());

            SqlDataAdapter adapter = new SqlDataAdapter(comm);
            DataTable dt = new DataTable();
            conn.Open();
            adapter.Fill(dt);
            conn.Close();

            return dt;
        }

1 个答案:

答案 0 :(得分:2)

你没有拥有第三个​​参数。你只有这些:

string uname, string pass

如果uname值可以是电子邮件地址或电话号码,并且您的表格中有Username列,那么您将与该列匹配:

select * from tblCustomer where Username=@uname and Password=@pass

字段包含的直观内容无关紧要,无论是电子邮件还是电话号码。该字段是一个字符串。任何唯一字符串都可以是用户名。


另一方面,如果数据库表有两个单独的字段(例如EmailPhone),那么您只需向查询添加两个参数:

select * from tblCustomer where (Email=@email OR Phone=@phone) and Password=@pass

并添加与参数相同的值:

lstP.Add(new SqlParameter("@email", uname));
lstP.Add(new SqlParameter("@phone", uname));

另一方面,如果用户将值输入到单独的字段中,并且您有单独的值进入该方法:

string email, string phone, string pass

然后您可以在查询中使用这些:

    select * from tblCustomer where (Email=@email OR Phone=@phone) and Password=@pass

并添加单独的值作为参数:

lstP.Add(new SqlParameter("@email", email));
lstP.Add(new SqlParameter("@phone", phone));

关键是,您需要做的就是将值传递给查询。处理值的方式结构不会改变它们是电子邮件地址还是电话号码。两者都是字符串,在语义上与代码无法区分。


注意:请确保您正确哈希用户密码。此代码建议(但不一定保证)您可能以纯文本格式存储用户密码。这样做对您的用户来说非常不负责任。请哈希密码,以便无法检索原始文本。