我正在尝试从这个表中选择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:Unknown 'where子句'中的列'LOGINPERIT1' sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at com.mysql.jdbc.Util.getInstance(Util.java:408)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)at at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)at at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)at at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)at 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 at info.infomila.info.ThreadHandler.run(ThreadHandler.java:56)
答案 0 :(得分:1)
正如评论中所提到的,您遇到的问题是因为您为登录和密码提供的字符串未包含在单引号中。
快速解决这个问题的方法是在定义的sql字符串中包含单引号,包括传入的登录值和@DevilsHnd在评论中提到的密码:
#A to_dict() solution
d = df.groupby(['Col X','Col Y']).sum().reset_index().pivot(columns='Col X',values='Sum').to_dict()
Out[70]:
{'A': {0: 3.0, 1: 2.0, 2: 1.0, 3: nan, 4: nan, 5: nan},
'B': {0: nan, 1: nan, 2: nan, 3: 5.0, 4: 6.0, 5: 7.0}}
#if you need to get rid of the nans:
{k1:{k2:v2 for k2,v2 in v1.items() if pd.notnull(v2)} for k1,v1 in d.items()}
Out[73]: {'A': {0: 3.0, 1: 2.0, 2: 1.0}, 'B': {3: 5.0, 4: 6.0, 5: 7.0}}
然而,这是一种危险的方法,我强烈建议您不要使用此方法,因为它使您的登录sql可以使用SQL注入。
为避免这种情况,您可以使用PreparedStatement
来处理您的输入消毒。
您可以使用String consulta = "SELECT COUNT(*) FROM Perit WHERE LOGIN = '" + Login +
"' AND PASSWORDMD5 = MD5('" + pass + "');"
替换语句参数,然后使用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
未在finally块中关闭 - 这可能会导致代码中出现内存泄漏。
请注意我使用资源块的尝试 - 这将关闭ResultSet
和PreparedStatement
,就像它们在finally块中关闭一样。
我会在这里留下这个xkcd漫画!