点击购物车减号图片按钮时所有商品数量均减1的代码问题排查
问题分析与修复方案
存在的问题
- 核心逻辑错误:点击减号时未定位到当前点击按钮对应的单个商品行,反而遍历了Repeater的所有行,导致购物车内所有商品都执行了数量减1的更新操作,这是触发异常的直接原因。
- 代码逻辑缺失:现有代码仅在循环中实例化了
SqlCommand对象,没有调用ExecuteNonQuery()方法执行SQL更新语句,若实际运行已经出现全商品减1的效果,说明你漏贴了该执行代码。 - 安全风险:直接将Id字符串拼接到SQL语句中,存在SQL注入漏洞,攻击者可构造特殊Id值篡改、删除数据库数据。
- 资源泄漏风险:
SqlConnection、SqlCommand未使用using语句自动释放托管资源,长时间运行可能导致数据库连接池溢出。
修复方案
- 直接通过
sender参数获取当前点击的减号按钮对应的Repeater行,无需遍历所有行 - 使用参数化查询避免SQL注入
- 增加数量校验,避免商品数量减到负数
- 用
using语句自动释放数据库资源
修复后代码:
protected void minus_Click(object sender, ImageClickEventArgs e) { // 获取当前点击按钮对应的Repeater行 RepeaterItem currentItem = (sender as ImageButton).NamingContainer as RepeaterItem; if (currentItem == null) return; // 读取当前行的商品Id string artId = ((Label)currentItem.FindControl("lblId")).Text; // 使用using自动释放资源 using (SqlConnection con1 = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)) { con1.Open(); // 参数化查询避免SQL注入,同时加判断避免数量减为负数 string sql = "UPDATE [Cart] SET Qty=Qty-1 WHERE ArtId = @ArtId AND Qty > 0"; using (SqlCommand command = new SqlCommand(sql, con1)) { // 添加参数 command.Parameters.AddWithValue("@ArtId", artId); // 执行SQL command.ExecuteNonQuery(); } } CountTotal(); Response.Redirect("/Buyer/Cart.aspx"); }
内容的提问来源于stack exchange,提问作者user12661888
相关产品推荐
相关产品推荐

