1

我在 Android 中开发了一种登录表单。我在这里使用了验证。我必须填写任何人(用户名或密码)然后我的应用程序应该显示成功!并且应该转移到其他活动。

但是,如果两个字段都为空,则不应显示成功消息,而应显示登录失败!!!.

请帮帮我。

这是我的网络服务代码:

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是毫无意义的,因为如果它们不包含任何内容,它只会是一个空字符串,或者"". 然后,为了简化您的网络服务代码......

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)))

请注意,我正在对照retrievedUserNameretrievedPassword检查用户名和密码,而不是相反,因为根据Javadoc for .retrievedUserNameretrievedPassword可能为空。getString(int)

返回:列值;如果值为 SQL NULL,则返回值为 null

如果该值为 null,那么您将处理 a NullPointerException,我想您可能希望避免这种情况。此外,出于同样的原因,您可能希望在尝试查询数据库之前检查参数是否为空值。

于 2012-09-10T04:25:37.167 回答