You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用同一用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:59:22