我的数据库由2列用户名和余额组成。 username的值为Mike,balance的值为null。我正在尝试更新余额,但由于某种原因它不会更新。我也没有任何错误。任何建议
<p>This is the deposit page</p>
<form action="deposit.jsp" method="POST">
<label>deposit: </label><input type="text" name="deposit"><br>
<label>name: </label><input type="text" name="name"><br>
<input type="submit" value="deposit">
<%
String deposit=request.getParameter("deposit");
String name=request.getParameter("name");
try{
Connection conn = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
Statement st=null;
st=conn.createStatement();
st.executeUpdate("update username set balance='"+deposit+"' where username='"+name+"'");
}
catch(Exception e){
System.out.println(e);
}
%>
</form>
</body>
</html>
答案 0 :(得分:2)
添加:
conn.commit()
在块结束时
答案 1 :(得分:1)
如果我理解正确发生的事情,那么一旦页面加载(而不是当用户点击提交时),你实际上就会调用数据库插入... ...在这种情况下你的sql将会正在寻找用户名=&#39;&#39;,对吧?也许我不理解你在做什么。并且你需要在整个shebang上调用commit(),但是在你实际给它一些有用的值之后呢。
[编辑..]哦,我看到你两次调用同一个页面,这取决于用户是否点击提交......这是处理这类事情的一种难以置信的坏方法......作为测试看看你是否可以把东西放在你的数据库中它很好,但是你真的绝不能像这样构建任何真实的东西。不惜一切代价保持您的演示文稿和业务逻辑分离。我知道JSP(以及PHP和所有其他模板引擎)让你能够合并它们,但仅仅因为你&#34; CAN&#34;做某事,并不代表你应该做的事。
[编辑2]
我们无法看到您的数据库,但是您真的有一个名为username的表,其中有一个名为username的列吗?因为这就是你现在正在谈论的内容。 update [TABLE NAME]
。我猜这是失败的,因为你试图写一个不存在的表。
哦,更新后调用commit。
答案 2 :(得分:1)
如果您创建两个页面以便查询只运行一次,那就更好了。第一页包含输入字段,例如您的案例名称和余额。因此,在将表单提交到下一页后,您可以将编写的代码放在scriptlet中。
同时写下System.out.println(e.getmessage())
。所以你可以看到正确的信息。
并在Mysql浏览器中尝试查询以确认查询中没有拼写错误。
答案 3 :(得分:1)
首次加载此页面时会尝试更新以下内容:
update username set balance='null' where username='null';
至少有一个用户拥有此信息并且类型为char
,不会发生任何事情。另一方面,今天使用scriptlets
被认为是不好的做法。我建议您应用MVC design pattern。
有一个很好的答案JSP using MVC and JDBC。