使用同一用户ID二次调用无法提取记录问题求助
问题分析与解决方案
嘿,我来帮你搞定这个问题!看了你的代码后,发现几个关键错误导致了第二次登录无法显示欢迎消息,咱们一步步来修正:
1. Login页面的Session赋值逻辑完全搞反了
你看这段代码:
if(dR.Read()) { intShopperID = Convert.ToInt32(Session["ShopperID"]); Session["ShopperID"]=intShopperID; Response.Redirect("Default.aspx"); }
这完全不对啊!当用户登录成功时,你应该从数据库查询到的SqlDataReader里读取ShopperID,再存入Session,而不是反过来从空的Session里取值再存回去。第一次登录时Session是空的,Convert.ToInt32(null)会把它转成0,所以你存了个无效的0到Session里;第二次登录时,你又把这个0重新存了一遍,这就导致Site.Master里拿到的永远是无效的ID,自然没法正确显示欢迎信息。
修正后的Login按钮点击事件代码:
protected void submitButton_Click(object sender, EventArgs e) { string strEmail = txtEmail.Text.ToLower().Trim(); string strPwd = txtPwd.Text.Trim(); // 重点:用参数化查询避免SQL注入,绝对不要直接拼接字符串! string strSqlCmd = "SELECT ShopperID FROM Shopper WHERE Email = @Email AND Passwd = @Passwd"; SqlCommand cmd = new SqlCommand(strSqlCmd); cmd.Parameters.AddWithValue("@Email", strEmail); cmd.Parameters.AddWithValue("@Passwd", strPwd); dR = drObj.ExecuteSelect(cmd); // 假设你的DatabaseMgmt支持传入SqlCommand,若不支持请改造该类 if(dR.Read()) { // 从DataReader中读取真实的ShopperID int intShopperID = Convert.ToInt32(dR["ShopperID"]); Session["ShopperID"] = intShopperID; Response.Redirect("Default.aspx"); } else { intShopperID = 0; lblMsg.Text = "Incorrect email or password"; lblMsg.ForeColor = System.Drawing.Color.Red; } dR.Close(); }
2. Site.Master没有真正从数据库读取用户名
你在Site.Master里写了查询语句,但根本没执行它,直接硬编码了lblWelcome.Text = "Welcome Eric";。这不仅无法显示真实的用户名,还会导致当Session里的ID无效时,错误地显示欢迎信息。
修正后的Site.Master页面加载代码:
protected void Page_Load(object sender, EventArgs e) { if (Session["ShopperID"] != null) { int shopperId = Convert.ToInt32(Session["ShopperID"]); // 同样用参数化查询 string strSqlCmd = "SELECT Name FROM Shopper WHERE ShopperID = @ShopperID"; SqlCommand cmd = new SqlCommand(strSqlCmd); cmd.Parameters.AddWithValue("@ShopperID", shopperId); SqlDataReader reader = dBObj.ExecuteSelect(cmd); if(reader.Read()) { // 读取真实用户名显示 string userName = reader["Name"].ToString(); lblWelcome.Text = $"Welcome {userName}"; } else { // 如果Session里的ID找不到用户,清空Session并切换到未登录状态 Session.Remove("ShopperID"); lblWelcome.Text = ""; logoutButton.Visible = false; loginButton.Visible = true; regButton.Visible = true; return; } reader.Close(); logoutButton.Visible = true; loginButton.Visible = false; regButton.Visible = false; } else { logoutButton.Visible = false; loginButton.Visible = true; regButton.Visible = true; lblWelcome.Text = ""; } }
额外提醒:务必避免SQL注入
你的原始代码直接拼接SQL字符串,这是非常危险的做法,攻击者可以通过输入特殊字符篡改SQL语句,窃取甚至破坏数据库数据。上面的修正代码都用了参数化查询,一定要保持这个习惯。
现在把这些修改应用到你的代码里,应该就能解决第二次登录无法显示欢迎消息的问题了!
内容的提问来源于stack exchange,提问作者Dulio Gesualdo
相关产品推荐
相关产品推荐

