我创建了一个表来显示数据,并且每个数据旁边都有一个复选框。我想创建一个函数,如果用户单击该数据的复选框并按Delete键,则该数据将从表和数据库中删除。我想出了代码,但它不会删除数据。我的代码有什么问题?
HTML
<%
String id = request.getParameter("hiddenID");
String sql1="";
{
sql1 = "select * from exercise1";
PreparedStatement pstmt1=conn.prepareStatement(sql1);
ResultSet rs1 = pstmt1.executeQuery();
while(rs1.next()){
String arm = rs1.getString("Arm");
String time1 = rs1.getString("Time1");
out.println("<tr>");
out.println("<td style = 'width: 20%'>");
out.println(arm);
out.println("</td>");
out.println("<td style = 'width: 5%'>");
out.println(time1);
out.println("</td>");
%>
<td style="width: 5%"><input class="mychkbox" type="checkbox"
value="<%=id%>" form="multipleDele" name="DeleteChkbox" /></td>
<%
out.println("</tr>");
}
conn.close();
}
%>
这是我的delete.jsp文件
<%
String[] id = request.getParameterValues("DeleteChkbox");
int count=0;
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
// Step 2: Define Connection URL
String connURL = "jdbc:mysql://localhost/medicloud?user=root&password=root";
// Step 3: Establish connection to URL
conn = DriverManager.getConnection(connURL);
if (id != null)
{
for(int i=0;i<id.length;i++){
String sqlStr = "DELETE from exercise1 WHERE id=?";
PreparedStatement pstmt = conn.prepareStatement(sqlStr);
pstmt.setInt(1, Integer.parseInt(id[i]));
//pstmt.setInt(1, Integer.parseInt(id[i]));
int rec=pstmt.executeUpdate();
if (rec==1)
count++;
}
}
//System.out.println(functions);
%>
<form action="exercise.jsp" method="post">
<label><%=count%> record(s) deleted!!</label>
<input type="submit" value="Return" name="ReturnBtn" />
</form>
<%
conn.close();
} catch (Exception e) {
out.println(e);
}
%>
答案 0 :(得分:0)
您正在写入复选框值的id
不是来自数据库结果。它是通过请求参数在JSP中检索的:
String id = request.getParameter("hiddenID");
...,然后将其写入每个复选框字段:
<input class="mychkbox" type="checkbox" value="<%=id%>" form="multipleDele" name="DeleteChkbox" />
您不会为每个复选框写一个不同的ID。
因此,它可能不是任何数据库记录的ID,因此没有一个被删除。
构建HTML时,您应该在while循环中读取每个记录的id
。
我怀疑您需要这样的东西:
<input class="mychkbox" type="checkbox" value="<%=rs1.getString("id")%>" form="multipleDele" name="DeleteChkbox" />
答案 1 :(得分:0)
您的图像分为三列:手臂锻炼,次数和动作。 DeleteChkboox
字段只会告诉您是否为特定行选择了该字段。您需要获取已选择删除的ID。未选中的复选框不会显示在一系列复选框中,因此您的表单必须考虑到这一点。它看起来应该像
<form action = "...">
<input type="submit" value="delete">
<input type="submit" value="assign">
<table>
<c:forEach items="${ records }" var="r">
<tr>
<td>
${ r.exercise }
</td>
<td>
${ r.times }
</td>
<td>
<input type="checkbox" value="${ r.id }" name="userAction">
</td>
</tr>
</c:forEach>
</table>
</form>
然后,您需要更改jsp,以便获取所选行的ID。将迭代ID的jsp部分更改为
<%
// get array of ids
String[] ids = request.getParameterValues("userAction");
int count=0;
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
// Step 2: Define Connection URL
String connURL = "jdbc:mysql://localhost/medicloud?user=root&password=root";
// Step 3: Establish connection to URL
conn = DriverManager.getConnection(connURL);
if (ids != null) {
for(int i=0; i < ids.length; i++) {
String sqlStr = "DELETE from exercise1 WHERE id=?";
PreparedStatement pstmt = conn.prepareStatement(sqlStr);
pstmt.setInt(1, Integer.parseInt(ids[i]));
int rec=pstmt.executeUpdate();
if (rec==1) {
count++;
}
}
}
}
%>
此外,如果可以帮助的话,在jsps中运行sql更新通常不是最好的主意。考虑将这种逻辑移至控制器类,并使用jsp层进行演示。
编辑
根据您的评论“它不起作用”,您不必看这个特定的问题(为什么您编写的代码不能删除数据),您必须查看更大的图景:您要解决的问题是什么完成吗?
用简单的英语看起来像这样:
第1步
遍历<form>
元素内jsp中的记录列表
对于每条记录,创建一个复选框,其值为该记录的ID
第2步
添加一个删除按钮,允许用户提交ID形式
第3步
处理提交的信息:获取在请求中提交的ID列表,对其进行迭代,并逐个删除记录
您坚持哪一步?