0

我有一个功能,允许用户在用户类中登录系统。登录后 - 从数据库中检索他们的名字和姓氏,并将其作为私有变量存储在 User 类中。

private String username = "";
private String forename = "";
private String surname = "";

public User(){}

public boolean loginButtonAction(String user, String pass) {
    try {
        String statement = "SELECT PUNAME, PPASS, PFNAME, PSNAME FROM APP.PERSON WHERE PUNAME = ? AND PPASS = ?";
        PreparedStatement ps = Main.getPreparedStatement(statement);
        ps.setString(1, user);
        ps.setString(2, pass);
        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            System.out.println("Logged in");
            username = user;
            forename = rs.getString("PFNAME");
            surname = rs.getString("PSNAME");
            return true;
        }
        rs.close();
        ps.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    System.out.println("Incorrect login details");
    return false;
}

我的 User 类中有公共方法来返回这些变量。

public String getUsername() {
    return username;
}

public String getForename() {
    return forename;
}

public String getSurname() {
    return surname;
}

我在我的 Main 类和方法中创建一个新的 User 实例用于测试目的,并且在成功登录后简单地打印用户的名字和姓氏:

User u = new User();
u.loginButtonAction("johnny", "arsenal");
System.out.println("Forename: " + u.getForename());

用户名工作正常,但当然不是从数据库中提取的。结果如下:

run:
Logged in
Forename: 

这是我在 APP.PERSON 中的数据库值:

在此处输入图像描述

我究竟做错了什么?

4

2 回答 2

3

在调试方面,您应该做的第一件事是替换:

forename = rs.getString("PFNAME");

和:

forename = rs.getString("PFNAME");
System.out.println ("forename set to [" + forename + "]");

这将告诉您在放置forname位置的位置放置了什么。

如果那是空白的,那么您的问题在于来自数据库的数据。


而且,根据您的最新更新,PFNAMEPSNAMEjohnny/arsenal确实是空白的。

所以看起来您的代码运行良好,只是您的数据库没有像您预期的那样填充。

select是区分大小写的,因此和johnny/arsenal之间存在差异Johnny/arsenal。也许您认为您想要大写变体,在这种情况下您应该使用:

u.loginButtonAction("Johnny", "arsenal");
于 2013-02-27T01:11:47.567 回答
1

您的数据库中有两个值。一个是大写的 Johnny,一个是小写的 johnny。

您正在查询小写字母 johnny,它没有 PFNAME 或 PSNAME 值。

在查看代码之前,请务必尝试测试您的 SQL。

于 2013-02-27T01:18:18.117 回答