我有一个“shopping_cart”表,其中包含用户订购的所有产品。该表有一个“数量”列,其中保存用户在购物车中添加特定产品的次数。如果用户在同一产品上第二次单击“添加到购物车”按钮,则新的数量值应该是旧的数量值 + 1。出于某种原因(我认为这很愚蠢),整个逻辑不起作用。数量始终为 1。
所以,我有一个产品列表,每个产品都有一个“添加到购物车”按钮,单击该按钮时,它会向 CartController servlet 发送请求,该 servlet 从访问数据库的 CartDAO 调用 addToCart() 方法并插入产品。在 CartDAO 文件中,方法 addToCart() 是一个 bool 值,如果插入了产品则返回 True,如果表中已存在则返回 False。正如您从下面的代码中看到的,第一个“if”检查行是否已更新,如果没有(意味着产品已经存在并且查询返回错误),它会进入“else”语句,该语句应该理论上,仅返回包含添加产品的表中的行,然后从该行的数量列中获取“数量”值,然后用 +1 更新它。由于某种原因,这不会发生。我已经检查了所有查询,并且 100% 确定它们具有有效的语法,我也知道产品确实已添加到购物车,因此 addToCart 方法的逻辑部分有效。我已经阅读了 ResultSet 对象的 javadoc,据此,一切都应该正常工作,因为我将光标指向 resultSet 的第一行,无论如何它只包含一行。帮助
这是当产品添加到购物车时访问的 CartController servlet 的 post 方法(抱歉,缺少语法突出显示,我不知道该怎么做):
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
Integer productID = Integer.parseInt(request.getParameter("productID"));
String fk_username = (String)session.getAttribute("username");
String productName = request.getParameter("productName");
String productPrice = request.getParameter("productPrice");
Integer productPriceSup = Integer.parseInt(request.getParameter("productPriceSup"));
String productImage = request.getParameter("productImage");
if(dao.addToCart(productID, fk_username, productName, productPrice, productPriceSup, productImage)) {
response.sendRedirect("processors.jsp");
}else {
String error3 ="Please try again later";
request.setAttribute("error3", error3);
request.getRequestDispatcher("processors.jsp").forward(request, response);
}
}
这是与问题相关的 CartDAO 代码:
public class CartDAO {
String sql ="insert into shopping_cart(P_ID, fk_uname, P_name, P_price, P_price_sup, P_image, quantity) values(?,?,?,?,?,?,?)";
String url = "jdbc:mysql://localhost:3306/WebApp?useSSL=false&serverTimezone=UTC";
String username="jipa";
String password="";
private Statement statement = null;
private Statement statement2 = null;
private ResultSet resultSet = null;
private int quantity=1;
public boolean addToCart(Integer productID, String fk_username, String productName, String productPrice, Integer productPriceSup, String productImage){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection= DriverManager.getConnection(url, username, password);
PreparedStatement pstatement= connection.prepareStatement(sql);
pstatement.setInt(1, productID);
pstatement.setString(2, fk_username);
pstatement.setString(3, productName);
pstatement.setString(4, productPrice);
pstatement.setInt(5, productPriceSup);
pstatement.setString(6, productImage);
pstatement.setInt(7, quantity);
if(pstatement.executeUpdate()>0) {
return true;
}else {
String getProduct ="select * from shopping_cart where fk_uname="+"\""+fk_username+"\""+" AND P_ID="+"\""+productID+"\"";
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
resultSet = statement.executeQuery(getProduct);
resultSet.absolute(1);
quantity=(resultSet.getInt("quantity")+1);
String addQuantity ="update shopping_cart set quantity="+"\""+quantity+"\""+" where P_ID="+"\""+productID+"\""+" AND fk_uname="+"\""+fk_username+"\"";
statement2 = connection.createStatement();
statement2.executeQuery(addQuantity);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
代码没有错误,运行得很好。如果我遗漏了一些重要的细节,请告诉我,以便我更新问题。
最佳答案
正如 Strawberry 所说,解决方案是删除整个“else”语句并用以下语句替换初始插入语句:
String sql ="insert into shopping_cart(P_ID, fk_uname, P_name, P_price, P_price_sup, P_image, quantity) values(?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE quantity=quantity+1;";
关于mysql - 当我添加表中已存在的产品时,数据库中的数量值未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57718093/