我一直试图让这段代码工作一段时间,但似乎不会。我的用户输入用户名和密码,然后程序将其与数据库进行比较。然而,它显示无效凭据,即使我输出密码时它显示完全相同的我输入。只有几点,我知道你们中的一些人会指出像使用单独的类连接,检查反对密码的用户名而不是使用Select *,使用hashings和all。但是现在我只需要让这段代码工作。只有在那之后,我才能在其他方面努力提高效率。提前谢谢大家。:)
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
Username1 = "jTextField1.getText()";
Password1 = "jPassword1Field2.geText()";
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://localhost:3306/";
String dbName = "VideoSystem" ;
String userName = "root";
String passWord = "**mypassword**";
Connection conn = DriverManager.getConnection(url+dbName, userName, passWord);
Statement st = conn.createStatement();
String sql = ("SELECT * FROM Identification");
ResultSet rs = st.executeQuery(sql);
while(rs.next())
{
password = rs.getString("Password");
if( Password1.equals(password))
{
MenuSelection obj1 = new MenuSelection();
obj1.setVisible(true);
}
else
{
JOptionPane.showMessageDialog(null, "Invalid Credentials", "System Message", JOptionPane.INFORMATION_MESSAGE);
}
}
conn.close();
}
catch (Exception e)
{
System.err.println("Got an exception! ");
System.err.println(e.getMessage());
}
}
答案 0 :(得分:3)
这两行:
Username1 = "jTextField1.getText()";
Password1 = "jPassword1Field2.geText()";
它们是字符串文字,因此除非您的密码字面上是 jPassword1Field2.geText(),否则不会匹配。我想你的意思是:
Username1 = jTextField1.getText();
Password1 = jPassword1Field2.getText();
但请注意,自 Java 2 以来,JPasswordField.getText()
已弃用。您应该使用getPassword()
代替:
Password1 = new String(jPassword1Field2.getPassword());
文档证明getText()
已弃用{&n 34;安全性原因"我无法理解,但您仍然不应该使用已弃用的API部分。
我已经了解了下面的一些内容,但这些都不是你问题的一部分,但我真的建议你
WHERE
子句(这需要清理输入,但是你应该这样做)并建立一个列列而不是获取*
。应用上述内容,我建议使用以下查询(假设名称字段名为Username
):
PreparedStatement st = conn.prepareStatement("SELECT `Password` FROM `Identification` WHERE `Username` = ?");
st.setString(1, Username1);
ResultSet rs = st.executeQuery();