1

Androidで1つのログインフォームを開発しました。ここでは検証を使用しました。誰か(ユーザー名またはパスワード)を入力する必要があります。そうすると、アプリに成功が表示されます。他のアクティビティに移動する必要があります。

ただし、両方のフィールドが空の場合、成功メッセージは表示されず、ログイン失敗が表示されます!!!

これを手伝ってください。

これは私のWebサービスコードです:

public class XcartLogin {
    public String authentication(String userName, String password) {
        String retrievedUserName = "";
        String retrievedPassword = "";
        String status = "";
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/xcart432-pro", "root", "");
            PreparedStatement statement = con.prepareStatement("SELECT * FROM xcart_customers WHERE login = '" + userName + "'");
            ResultSet result = statement.executeQuery();
            while (result.next()) {
                retrievedUserName = result.getString("login");
                retrievedPassword = result.getString("password");
            }
            if (retrievedUserName.equals(userName) && retrievedPassword.equals(password)) {
                status = "Success!";
            } else {
                status = "Login fail!!!";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return status;
    }
}

これは私のAndroidコードの検証です:

if(status.equals("Success!"))
    {
        // ADD  to save  and  read next time
        String strUserName = userName.getText().toString().trim();
        String strPassword = userPassword.getText().toString().trim();
        if (null == strUserName || strUserName.length() == 0)
        {
            // showToast("Enter Your Name");
            userName.setError( "username is required!" );
            isUserValidated = false;
        }
        if (null == strPassword || strPassword.length() == 0)
        {
            // showToast("Enter Your Password");
            isPasswordValidated = false;
            userPassword.setError( "password is required!" );
        } 
    }
4

3 に答える 3

3

検証コードのステートメントの前に、if(status.equals("Success!"))最初にこれを実行して、最初にテキストフィールドのいずれかが空の場合にデータベースにクエリを実行しないようにする必要があります。

boolean errorOccurred = false;
if (strUserName.equals("")) {
    userName.setError("Username is required!");
    errorOccurred = true;
}

if (strPassword.equals("")) {
    userName.setError("Password is required!");
    errorOccurred = true;
}

if (errorOccurred) {
    return; // avoids executing the part of your code which queries the db
}

null入力フィールドの値が何も含まれていない場合は空の文字列または。であるため、入力フィールドの値が含まれているかどうかを確認することはまったく無意味""です。次に、Webサービスコードを単純化するために...

if (result.next()) { // use if instead of while, because ideally, only ONE record should
                     // be returned and hence, no need to loop;

    // then, just get the corresponding password
    retrievedPassword = result.getString("password");
}

if (retrievedPassword.equals(password)) {
    status = "Success!";
}

さらなる提案:「成功!」を入れてください 定数でString、リテラル値の代わりにそれを使用します。この方法でミスを犯す可能性が低くなり、コードの編集が容易になります。

于 2012-09-10T04:28:01.150 に答える
2

この条件を使用してみてください:

if(retrievedUserName.equals(userName)&&retrievedPassword.equals(password)&&!(retrievedUserName.equals("") && retrievedPassword.equals("")))

あなたの状態の代わりに:

if(retrievedUserName.equals(userName)&&retrievedPassword.equals(password))
于 2012-09-10T04:11:58.947 に答える
0

まず第一に、PreparedStatementの使用方法が正しくありません。変更する方法は次のとおりです。

PreparedStatement statement =  con.prepareStatement("SELECT * FROM xcart_customers WHERE login = ?");

次に、を使用しsetString(int paramIndex, String value)て値を設定し、メソッドを呼び出しますexecuteQuery()。このようなもの:

PreparedStatement statement =  con.prepareStatement("SELECT * FROM xcart_customers WHERE login = ?");
statement.setString(1, userName);

ResultSet result = statement.executeQuery();

これは安全であり、コードでPreparedStatementを使用する実際の方法です。

ここで、要件をテストするには、次のようなことを行う必要があります。

if(userName.equals(retrievedUserName)&&password.equals(retrievedPassword)&&!("".equals(retrievedUserName) && "".equals(retrievedPassword)))

のJavadocによると、 retrieveUserNameまたはretrievePasswordがnullである可能性があるため、 userNamepasswordをretrieveUserNameretrievePasswordに対してチェックしていることに注意してください。その逆ではありませんgetString(int)

戻り値:列の値。値がSQLNULLの場合、返される値はnullです。

値がnullになる場合は、を処理することになりますがNullPointerException、これは避けたいと思います。また、まったく同じ理由で、データベースにクエリを実行する前と同じように、引数のnull値を確認することもできます。

于 2012-09-10T04:25:37.167 に答える