我正在为uni项目工作(恰好在14小时内到期),我处于一个棘手的问题。它是一个基于web的网上商店,运行在apache tomcat和derby的eclipse上。准备语句失败,但SQL控制台工作
我有一个准备语句,检查用户名和passwordhash,不管我尝试这个语句返回0行。同样的sql在sql暂存区中运行并返回预期的结果。
我已经使用调试器来检查准备的语句对象,并且查询看起来很好。文本中的?仍然存在,而不是充满变量,但这似乎很正常。我也尝试从控制台运行完全相同的手写sql,但没有任何运气。
我在sql控制台运行查询是
SELECT * FROM username WHERE username='[email protected]' AND passwordhash='passwordhash'
的准备statments这个样子。
PreparedStatement pstmt = db.prepareStatement("SELECT * FROM reallynice.username " +
"WHERE emailaddress=?" +
" AND passwordhash=?");
pstmt.setString(1,username);
pstmt.setString(2, username + ":" + passwordLogin);
我已经尝试过所有的事情,并且已经用尽了搜索。我知道这是一个uni项目,标准答案是让人们看一看。在这一点上,我需要勺子喂一条路走下去。
编辑这里有一些更多的背景知识,我试着在这个管道中运行一个已知的工作查询,它也无法返回任何行。
public static User getUser(String username, String passwordHash) {
DBBean db = new DBBean();
System.out.println("Logging in for username " + username + " and password " + passwordHash);
try {
ResultSet rs;
PreparedStatement pstmt = db.prepareStatement("SELECT * FROM reallynice.username " +
"WHERE emailaddress=?" +
" AND passwordhash=?");
pstmt.setString(1,username);
pstmt.setString(2,passwordHash);
//PreparedStatement pstmt = db.prepareStatement("SELECT * FROM reallynice.product");
//PreparedStatement pstmt = db.prepareStatement("SELECT * FROM reallynice.username WHERE emailaddress='[email protected]' AND passwordhash='megahashstring'");
rs = pstmt.executeQuery();
System.out.println("Rows returned\t" + rs.getRow());
if(rs.getRow() < 1)
return null;
int id = rs.getInt("uid");
String name = rs.getString("name");
String emailaddress = rs.getString("emailaddress");
String password = rs.getString("passwordhash");
boolean isAdmin = false;
pstmt = db.prepareStatement("SELECT * FROM reallnice.admin WHERE uid= ?");
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
if(rs.getMetaData().getColumnCount() > 0)
isAdmin = true;
return new User(id,isAdmin,name,emailaddress,password);
} catch(Exception ex) {
System.out.println(ex);
}
return null;
}
我还包括了我为此尝试的其他查询。
你知道你正在查询的sql语句是基于用户名和基于电子邮件地址查询的准备好的语句吗? – 2011-05-05 21:40:26
您可能需要退出变量并尝试'select * from reallynice.username'来验证您是否拥有有效的连接等。然后对这些值进行硬编码。一旦你从那里回来,转向替代问题。 – Justin 2011-05-05 21:41:06
也许可以通过将您的语句提取到需要的最小值来开始调试。除了'select * from reallynice'之外,删除所有内容;在返回结果后,添加用户名参数,最后输入密码参数。 (也许这是一些错别字,但是你在准备好的语句中的查询与控制台版本不匹配。) – 2011-05-05 21:44:51