我正在使用JDBC尝试从这个表中选择:
CREATE TABLE PERIT (
COGNOM1 VARCHAR(30) NOT NULL,
COGNOM2 VARCHAR(30) NOT NULL,
DATANAIX DATE NOT NULL,
NOM VARCHAR(30) NOT NULL,
NIF VARCHAR(10) NOT NULL,
LOGIN VARCHAR(50) NOT NULL,
PASSWORDMD5 VARCHAR(50) NOT NULL,
NUMERO INT(3) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (NUMERO)
);
我想检查是否存在具有特定登录名和PASSWORDMD5值的行,如下所示:
public int Login(String Login, String pass) {
Statement st = null;
ResultSet rs = null;
int count =0;
try {
st = con.createStatement();
String consulta = "Select count(*) from Perit p where p.LOGIN =";
consulta += Login;
consulta +=" and p.PASSWORDMD5 = MD5(";
consulta +=pass;
consulta+=")";
rs = st.executeQuery(consulta);
while (rs.next()) {
count = rs.getInt(1);
}
st.close();
rs.close();
} catch (SQLException ex) {
Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
}
return count;
}
但是,当我调用Login("LOGINPERIT1","PASSWORDMDPERIT")
时,我会得到以下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列'LOGINPERIT1‘在'where子句’在sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法中)在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62),在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45),在java.lang.reflect.Constructor.newInstance(Constructor.java:423),在com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql。com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455) at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1369) at info.infomila.info.JDBCMySQL.Login(JDBCMySQL.java:139) at info.infomila.info.ThreadHandler.run(ThreadHandler.java:56)
发布于 2017-05-23 04:09:11
正如注释中提到的,您所得到的问题是,您为登录和密码提供的字符串没有包含在单引号中。
解决这一问题的快速方法是在定义的sql字符串中包含单引号,包括输入和密码的传入值,如@DevilsHnd在注释中提到的:
String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = '" + Login +
"' AND PASSWORDMD5 = MD5('" + pass + "');"
但是,这是一种危险的方法,我强烈建议您不要使用这种方法,因为它使登录sql无法接受SQL注入。
为了避免这种情况,您可以使用一个PreparedStatement
,它将负责清理您的输入。
为此,您可以使用?
替换语句参数,然后使用PreparedStatement类的方法设置它们。
下面是如何实现这一目标的示例:
String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = ? AND PASSWORDMD5 = MD5(?);"
try(PreparedStatement pstmt = con.prepareStatement(consulta))
{
pstmt.setString(1, login);
pstmt.setString(2, pass);
try(ResultSet rs = pstmt.executeQuery())
{
count = rs.getInt(1);
}
}
catch (SQLException ex)
{
Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
}
在您的方法中,另一个值得关注的地方是,您的Statement
和ResultSet
没有在一个最终块中关闭--这可能会导致代码中的内存泄漏。
注意,我使用了一个try with资源块--它将关闭PreparedStatement
和ResultSet
,就好像它们是在一个finally块中关闭的一样。
我就把这张xkcd漫画留在这里!
https://stackoverflow.com/questions/44124440
复制相似问题