我有一个登录页面。我想使用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;
}
答案 0 :(得分:2)
你没有拥有第三个参数。你只有这些:
string uname, string pass
如果uname
值可以是电子邮件地址或电话号码,并且您的表格中有Username
列,那么您将与该列匹配:
select * from tblCustomer where Username=@uname and Password=@pass
字段包含的直观内容无关紧要,无论是电子邮件还是电话号码。该字段是一个字符串。任何唯一字符串都可以是用户名。
另一方面,如果数据库表有两个单独的字段(例如Email
和Phone
),那么您只需向查询添加两个参数:
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));
关键是,您需要做的就是将值传递给查询。处理值的方式结构不会改变它们是电子邮件地址还是电话号码。两者都是字符串,在语义上与代码无法区分。
注意:请确保您正确哈希用户密码。此代码建议(但不一定保证)您可能以纯文本格式存储用户密码。这样做对您的用户来说非常不负责任。请哈希密码,以便无法检索原始文本。