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

点击购物车减号图片按钮时所有商品数量均减1的代码问题排查

问题分析与修复方案

存在的问题

  • 核心逻辑错误:点击减号时未定位到当前点击按钮对应的单个商品行,反而遍历了Repeater的所有行,导致购物车内所有商品都执行了数量减1的更新操作,这是触发异常的直接原因。
  • 代码逻辑缺失:现有代码仅在循环中实例化了SqlCommand对象,没有调用ExecuteNonQuery()方法执行SQL更新语句,若实际运行已经出现全商品减1的效果,说明你漏贴了该执行代码。
  • 安全风险:直接将Id字符串拼接到SQL语句中,存在SQL注入漏洞,攻击者可构造特殊Id值篡改、删除数据库数据。
  • 资源泄漏风险:SqlConnection、SqlCommand未使用using语句自动释放托管资源,长时间运行可能导致数据库连接池溢出。

修复方案

  1. 直接通过sender参数获取当前点击的减号按钮对应的Repeater行,无需遍历所有行
  2. 使用参数化查询避免SQL注入
  3. 增加数量校验,避免商品数量减到负数
  4. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:48:02