0

ユーザーが User クラスでシステムにログインできるようにする機能があります。ログインすると、名前と姓がデータベースから取得され、プライベート変数として 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 の姓と名を出力しています。

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これにより、そこに配置されているポイントに何が配置されているかがわかります。

それが空白の場合、問題はデータベースから出力されるデータにあります。


そして、最新の更新に基づいて、PFNAMEとのPSNAMEjohnny/arsenalは実際には空白です。

したがって、コードは完全に機能しているように見えますが、データベースが期待どおりに読み込まれていないだけです。

select大文字と小文字が区別されるため、 と には違いがjohnny/arsenalありJohnny/arsenalます。おそらく、大文字のバリアントが必要だと考えていたのでしょう。その場合は、次を使用する必要があります。

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

DB には 2 つの値があります。1 つは大文字の Johnny で、もう 1 つは小文字の johnny です。

小文字の johnny を照会していますが、PFNAME または PSNAME の値がありません。

コードを調べる前に、必ず SQL をテストしてください。

于 2013-02-27T01:18:18.117 に答える