简体   繁体   English

记录存在问题+文本字段标准

[英]Problem with record existence + text field criteria

Basically, a have a sign-up interface THAT should empty fileds and certain conditions and if record exist in data basewhere first it checks if text fields are empty as written below : 基本上,有一个注册接口应该清空文件和某些条件,如果记录存在于数据库中,首先它检查文本字段是否为空,如下所示:

 private void confirmActionPerformed(java.awt.event.ActionEvent evt) {                                        
            //  String f= "jdbc:derby://localhost:1527/BStest";
     String name=username.getText();
            String gender=null;
            String passw=String.valueOf(pass.getPassword());
             String repassw=String.valueOf(repass.getPassword());
            String phone2=phone.getText();
            String emaill=email.getText();
            boolean checkage=false,checknum=false,checkcap=false,checklaw=false,checkemail=false,checkdomain=false;
            boolean checklen=false,checkbfat=false,checkpass=false,checkchar=false,checkgender=false;
                boolean    checkempty=true;

              if(name.isEmpty()){//is text field empty 
              checkempty=false;
              JOptionPane.showMessageDialog(null,"Add a username!");}
          if(passw.isEmpty()){//is text field empty 
              checkempty=false;
              JOptionPane.showMessageDialog(null,"Add a Password!");}
           if(!repassw.equals(passw)){//confirmed password is the same for password
               checkempty=false;
               JOptionPane.showMessageDialog(null,"Type password Again!");
           }
           if(phone2.isEmpty()){//is text field empty 
               checkempty=false;
               JOptionPane.showMessageDialog(null,"Add Phone number !");
           }
           if(emaill.isEmpty()){//is text field empty 
               checkempty=false;
               JOptionPane.showMessageDialog(null,"Add email please !");
           }

           if (!m.isSelected()&& !female.isSelected()){//no gender selected
               checkempty=false;
               JOptionPane.showMessageDialog(null,"Choose a gender !!");}
          else if (m.isSelected()&& female.isSelected()){//both selected it shoud be only one
              checkempty=false;
               JOptionPane.showMessageDialog(null,"Select only  One !!");}
          if(age.getText().isEmpty()){//is age text field has no input
             checkempty=false;
            JOptionPane.showMessageDialog(null,"Enter your age !!");}

Secondly checks the criteria for each text field as indicated in the comments below 其次,检查每个文本字段的标准,如下面的注释所示

if (m.isSelected()){// is female or male selected
               checkgender=true;
                 gender="Male";
             }
           else if (female.isSelected()){
               checkgender=true;
                 gender="Female";
             }
            int agee =Integer.parseInt(age.getText());      
            char c,c2=emaill.charAt(0);
            String zereofive=phone2.substring(0, 2);//start with 05
         String bfat = emaill.substring(0,emaill .indexOf("@"));//digits berfore @
String domain = emaill.substring(emaill .indexOf("@") + 1);//check domain
       if(Character.isLetter(c2))//is first char off email iis letter
            checkchar=true;
           else
           JOptionPane.showMessageDialog(null,"Emails only start with letters");


     if (phone2.length()==10 &&  zereofive.equals("05"))//check length of phone number 
          checklen=true;
        else
          JOptionPane.showMessageDialog(null,"enter 10 digits for the phone number and starts with 05");
if(bfat.length()>=6 || bfat.length()<=15){//check digits before @
   checkemail=true;
}
   if(domain.equals("gmail.com") || domain.equals("hotmail.com")){//check domain of email 
       checkdomain=true;
   }
       else
    JOptionPane.showMessageDialog(null,"Email domain is wrong");
   if(agee>=18)//only can register in 18 or above
                checkage=true;
          else
              JOptionPane.showMessageDialog(null,"You can't register because you are under 18. ");

    if(passw.length()>7){// password at least 8 digit  at least one captial and one small letter
           checklen=true;
          for (int i=0;i<passw.length();i++){
              c=passw.charAt(i);
          if(Character.isDigit(c))
          checknum=true;
          else if (Character.isUpperCase(c))
              checkcap=true;
          else if (Character.isLowerCase(c))
              checklaw=true;
          if(checknum && checkcap && checklaw )
              checkpass=true;

          }}
    if(checkpass)//check of all 3 crietria of pass word is coorrect 
        checkpass=true;
          else
            JOptionPane.showMessageDialog(null,"password must be at least 8 digits \n at least 1 Upper Case letter \n at least 1 Lower Case letter \n at least 1 number \n");

and lastly stores in the database if criteria is meet and record is not exists 如果符合条件且记录不存在,则最后存储在数据库中

    PreparedStatement reg,exist;
           String query="INSERT INTO customer (Cu_name, Cu_password, Cu_age, Cu_gender, Cu_email, Cu_phone) VALUES (?, ?, ?, ?, ?, ?)";//enter user info in database
           String record_exists="SELECT * FROM customer where Cu_name=? and Cu_password= ? and Cu_age=? and Cu_gender=? and Cu_email=? and Cu_phone=?";
           try{
               String f= "jdbc:derby://localhost:1527/BStest";
                Connection connection = DriverManager.getConnection(
            f, "meme", "Moudhi102"); 
          reg=connection.prepareStatement(query);
          exist=connection.prepareStatement(record_exists);
          reg.setString(1, name);
           reg.setString(2, passw);
             reg.setInt(3, agee);     
              reg.setString(4, gender);
               reg.setString(5, emaill);
                reg.setString(6, phone2);
                 exist.setString(1, name);
           exist.setString(2, passw);
             exist.setInt(3, agee);     
              exist.setString(4, gender);
               exist.setString(5, emaill);
                exist.setString(6, phone2);
                rs=exist.executeQuery();

                if(rs==null){            
       if(checkpass &&checkage && !checkdomain &&  !checkemail && !checklen && checkchar && !checkgender && checkempty    ){//if all criteria justified then add it to database

                   reg.executeUpdate();
                    JOptionPane.showMessageDialog(null,"Complete! new user added !! "); 

    }

        }else//else it can't be added
   {
       JOptionPane.showMessageDialog(null, "Record already exists");
    }
           }
           catch(SQLException ex){
            JOptionPane.showMessageDialog(null,ex);
        }

the problem is it doesn't show a message if record already exists in database and if I entered empty text in age + phone + email it shows the message that it is empty but in the NetBeans itself shows an error message in the output area like below at 问题是,如果记录已存在于数据库中,并且如果我在age + phone + email中输入空文本,则它不显示消息,它显示消息它是空的但是在NetBeans本身中显示输出区域中的错误消息,如在下面

java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:592)
    at java.lang.Integer.parseInt(Integer.java:615)
    at event_system.Sign_up.confirmActionPerformed(Sign_up.java:275)
    at event_system.Sign_up.access$000(Sign_up.java:20)
    at event_system.Sign_up$1.actionPerformed(Sign_up.java:70)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6533)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)

and doesn't do the coding part of these three fields and show their messages even for password if criteria is not meet and other field inputs are ok is shows a continuous message of record exists and Can't register check/fill you information.Please help me i'm stuck and can't figure it out 如果标准不符合且其他字段输入正常则显示连续的记录消息存在且无法注册检查/填写您的信息,并且不执行这三个字段的编码部分并显示其消息即使是密码也是如此。请帮助我,我卡住了,无法弄清楚

Deal with your exception first before even considereing to deal with your other problems since it will prevent the other portions of your code to be run from the point of exception and therefore be the root cause to all your problems at this time. 在考虑处理其他问题之前先处理您的异常,因为它会阻止代码的其他部分从异常点运行,因此是您此时所有问题的根本原因。

You can not pass a Null String ("") to the Integer#parseInt() method: 您不能将Null字符串(“”)传递给Integer#parseInt()方法:

int agee = Integer.parseInt(age.getText());

If the Text Field that is to contain an age is empty then the JTextField#getText() method will return a Null String (""). 如果要包含age的文本字段为空,则JTextField#getText()方法将返回Null字符串(“”)。 If you supply this to the Integer#parseInt() method (as you've done in the above code) or anything other than an integer value then a NumberFormatException is generated. 如果将此提供给Integer#parseInt()方法(如上所述)或除整数值以外的任何值,则会生成NumberFormatException You need to take care of this possible condition and the use of a Ternary Operator (aka Conditional Operator) may be all you need: 您需要处理这种可能的情况,并且您可能需要使用三元运算符 (也称为条件运算符):

int agee = age.getText().trim().equals("") ? 0 : Integer.parseInt(age.getText().trim());

This however doesn't cover the fact that a alpha character might accidently be supplied within the Age text field. 然而,这并未涵盖在Age文本字段中可能意外提供字母字符的事实。 To cover that problem it may be just better to do: 为了解决这个问题,可能更好:

String theAge = age.trim().getText();
int agee = 0;
// Regular Expression used to ensure a Integer 
// Numerical String value was supplied.
if (theAge.matches("\\d+")) {
    agee = Integer.parseInt(theAge);
}

In the above line of code, IF the Age text-field contains nothing or blank spaces then the agee variable is supplied a integer 0 value ELSE the Integer.parseInt() method is used with the contents of the Text Field to fill the agee variable. 在上面的代码行中,如果Age文本字段不包含空格或空格,则agee变量提供整数0值ELSE Integer.parseInt()方法与Text Field的内容一起使用以填充agee变量。

On a side note: 在旁注:

You utilize a lot of boolean flags for each of your text fields so as to ensure validity and other things. 您为每个文本字段使用了许多布尔标志,以确保有效性和其他内容。 From what I can see you actually don't need any of them since you are checking all fields and your requirements are that all those fields actually be filled: 从我可以看到你实际上不需要任何它们,因为你正在检查所有字段,你的要求是所有这些字段实际上被填充:

boolean checkage=false, checknum=false, checkcap=false, checklaw=false, 
        checkemail=false,checkdomain=false;
boolean checklen=false, checkbfat=false, checkpass=false, checkchar=false, 
        checkgender=false;
boolean checkempty=true;

I would get rid of all of them and and not use a flag at all. 我会摆脱所有这些并且根本不使用旗帜。 If at any time within your code any one of your Text Fields does not meet validity within the confirmActionPerformed() event then nothing should be read from or written to the database. 如果您的代码中的任何一个文本字段在confirmActionPerformed()事件中的任何一个文本字段都不符合有效性,那么不应该从数据库读取任何内容或将其写入数据库。 As the fields are checked for validity and any of those fields fail you simply need to display the fact via Message Box then when the User selects the OK button we set focus on the Text Field currently being checked ( age.requestFocus(); ) then exit the event with a return; 当检查字段的有效性并且任何这些字段失败时,您只需要通过消息框显示事实,然后当用户选择确定按钮时,我们将焦点设置在当前正在检查的文本字段上( age.requestFocus(); )然后退出事件退出return; statement. 声明。 Database code can never be reached unless all your text fields passes validity. 除非所有文本字段都通过有效性,否则永远无法访问数据库代码 Your event code might look like this: 您的事件代码可能如下所示:

private void confirmActionPerformed(java.awt.event.ActionEvent evt) {
    //  String f= "jdbc:derby://localhost:1527/BStest";
    String name = username.getText().trim();
    String gender = null;
    String passw = String.valueOf(pass.getPassword());
    String repassw = String.valueOf(repass.getPassword());
    String phone2 = phone.getText().trim();
    String emaill = email.getText().trim();

    // NAME
    //is Name text field empty 
    if (name.isEmpty()) {
        JOptionPane.showMessageDialog(null, "Add a username!");
        username.requestFocus();
        return;
    }

    // PASSWORD
    //is Password field empty 
    if (passw.isEmpty()) {
        JOptionPane.showMessageDialog(null, "Add a Password!");
        pass.requestFocus();
        return;
    }
    /* A Regular Expression is used here to ensure your desired
       password rules apply - Minimum of 8 characters in length,
       at least 1 Uppercase Letter, at least 1 Lowercase letter, 
       at least 1 digit.   */
    if (!passw.matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$")) {
        JOptionPane.showMessageDialog(null, "Password must be:\n\n"
                + "- At least 8 characters in length,\n"
                + "- Contain at least 1 Uppercase letter,\n"
                + "- Contain at least 1 Lowercase letter,\n"
                + "- Contain at least 1 number.");
        pass.requestFocus();
        return;
    }
    // confirmed password is the same for password
    if (!repassw.equals(passw)) {
        JOptionPane.showMessageDialog(null, "Type password Again!");
        repass.requestFocus();
        return;
    }

    // PHONE
    //is phone text field empty 
    if (phone2.isEmpty()) {//is text field empty 
        JOptionPane.showMessageDialog(null, "Add Phone number !");
        phone.requestFocus();
        return;
    }
    // starts with 05
    String zereofive = phone2.substring(0, 2);
    // check length of phone number 
    if (phone2.length() != 10 && !zereofive.equals("05")) {
        JOptionPane.showMessageDialog(null, "enter 10 digits for the phone number and starts with 05");
        phone.requestFocus();
        return;
    }

    // E-MAIL
    //is E-Mail text field empty
    if (emaill.isEmpty()) {
        JOptionPane.showMessageDialog(null, "Add email please !");
        email.requestFocus();
        return;
    }
    // E-Mail
    char c, c2 = emaill.charAt(0);
    String bfat = emaill.substring(0, emaill.indexOf("@"));//digits berfore @
    String domain = emaill.substring(emaill.indexOf("@") + 1);//check domain
    // is first char off email a letter
    if (!Character.isLetter(c2)) {
        JOptionPane.showMessageDialog(null, "Emails can only start with letters!");
        email.requestFocus();
        return;
    }
    //check digits before @
    if (bfat.length() < 6 || bfat.length() > 15) {
        JOptionPane.showMessageDialog(null, "Invalid digits in Email address!");
        email.requestFocus();
        return;
    }
    //check domain of email
    if (!domain.equals("gmail.com") && !domain.equals("hotmail.com")) {
        JOptionPane.showMessageDialog(null, "Email domain is wrong!");
        email.requestFocus();
        return;
    }

    // GENDER
    //no gender selected
    if (!m.isSelected() && !female.isSelected()) {
        JOptionPane.showMessageDialog(null, "Choose a Gender!!");
        return;
    }
    //both Genders are selected where it shoud be only one
    else if (m.isSelected() && female.isSelected()) {
        JOptionPane.showMessageDialog(null, "Select only One Gender!!");
        return;
    }
    // is female or male selected
    if (m.isSelected()) {
        gender = "Male";
    }
    else if (female.isSelected()) {
        gender = "Female";
    }

    // AGE
    //is Age text field empty
    String theAge = age.trim().getText();
    if (theAge.isEmpty()) {
        JOptionPane.showMessageDialog(null, "Enter your age !!");
        age.requestFocus();
        return;
    }
    int agee = 0;    // Default
    // Regular Expression used to ensure a Integer 
    // Numerical String value was supplied.
    if (theAge.matches("\\d+")) {
        agee = Integer.parseInt(theAge);
    }
    // only 18 + can register
    if (agee < 18) {
        JOptionPane.showMessageDialog(null, "You can't register because you are under 18!");
        age.requestFocus();
        return;
    }

    // DATABASE
    Connection connection = null;
    PreparedStatement reg, exist;
    ResultSet rs = null;
    String query = "INSERT INTO customer (Cu_name, Cu_password, Cu_age, Cu_gender, Cu_email, Cu_phone) VALUES (?, ?, ?, ?, ?, ?)";//enter user info in database
    String record_exists = "SELECT * FROM customer where Cu_name=? and Cu_password= ? and Cu_age=? and Cu_gender=? and Cu_email=? and Cu_phone=?";
    try {
        String f = "jdbc:derby://localhost:1527/BStest";
        connection = DriverManager.getConnection(f, "meme", "Moudhi102");
        reg = connection.prepareStatement(query);
        exist = connection.prepareStatement(record_exists);
        reg.setString(1, name);
        reg.setString(2, passw);
        reg.setInt(3, agee);
        reg.setString(4, gender);
        reg.setString(5, emaill);
        reg.setString(6, phone2);

        exist.setString(1, name);
        exist.setString(2, passw);
        exist.setInt(3, agee);
        exist.setString(4, gender);
        exist.setString(5, emaill);
        exist.setString(6, phone2);
        rs = exist.executeQuery();

        if (rs == null) {
            reg.executeUpdate();
            JOptionPane.showMessageDialog(null, "Complete! new user added !! ");
        }
        // User Already Exists In Database
        else {
            JOptionPane.showMessageDialog(null, "User already exists");
        }
    }
    catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, ex);
    }
    finally {
        if (reg != null) {
            reg.close();
        }
        if (rs != null) {
            rs.close();
        }
        if (connection != null) {
            connection.close();
        }
    }

}

Age may not necessarily be a good piece of criteria to use in your query WHERE clause when checking database records for a duplicate record of a particular User. 在检查特定用户的重复记录的数据库记录时,在查询WHERE子句中使用年龄可能不一定是一个很好的标准。 It only enforces the fact that each record is only valid for a single year. 它只强制执行每条记录仅对一年有效的事实。 Things change and Age, E-Mails, Phone Numbers, etc are some of those things that can change often. 事情发生变化,年龄,电子邮件,电话号码等等都是经常变化的事情。 There is obviously nothing wrong with the concept if only the Name and Password are used for access validity (which should suffice for most cases) and the remaining criteria is merely used for indicating that updating is required to the User data account. 如果只有名称和密码用于访问有效性(这应该足以满足大多数情况),概念显然没有任何问题,其余标准仅用于指示用户数据帐户需要更新。

You should consider Supplied Passwords to be hashed and it is the hash that is stored in database. 您应该考虑对提供的密码进行哈希处理,它是存储在数据库中的哈希值。 When a User supplies a password then that password is hashed and compared to a hash already stored in database. 当用户提供密码时,该密码将被哈希并与已存储在数据库中的哈希进行比较。 No one, including yourself should ever know what the password truly is. 包括你自己在内的任何人都不应该知道密码究竟是什么。 Only the User should ever know what the password might be. 只有用户才能知道密码是什么。 jBCrypt works pretty good for this. jBCrypt对此非常有用 To hash a password using this library: 使用此库散列密码:

Imports: 进口:

import org.mindrot.jbcrypt.BCrypt;
import static org.mindrot.jbcrypt.BCrypt.hashpw;

A Class Member Varaible: 一类成员可变:

// Define the BCrypt WORKLOAD to use when generating
// password hashes. 10-31 is a valid value.
private static final int WORKLOAD = 12;

To Hash a plaintext password so as to store in database: 要散列明文密码以便存储在数据库中:

/**
 * This method can be used to generate a string representing an account
 * password suitable for storing in a database. It will be an OpenBSD-style
 * crypt(3) formatted hash string of length=60 The BCrypt WORKLOAD is
 * specified in the above static variable, a value from 10 to 31. A WORKLOAD
 * of 12 is a very reasonably safe default. This automatically handles
 * secure 128-bit salt generation and storage within the hash.
 *
 * @param password_plaintext The account's plaintext password as provided
 *                           during account creation, or when changing an
 *                           account's password.
 *
 * @return String - a string of length 60 that is the bcrypt hashed password
 *         in crypt(3) format.
 */
public static String hashPassword(String password_plaintext) {
    String salt = BCrypt.gensalt(WORKLOAD);
    String hashedPassword = hashpw(password_plaintext, salt);
    return hashedPassword;
}

To check a plaintext password with a stored hash from database: 要使用数据库中存储的哈希检查明文密码:

/**
 * This method can be used to verify a computed hash from a plaintext (e.g.
 * during a login request) with that of a stored hash from a database. The
 * password hash from the database must be passed as the second argument.
 *
 * @param passwordAsPlainText The accounts plaintext password, as provided
 *                            during a login request
 *
 * @param storedEncryption    The accounts stored password hash, retrieved
 *                            from the authorization database
 *
 * @return boolean - true if the password matches the password of the stored
 *         hash, false otherwise
 */
/*
public static boolean checkPassword(String passwordAsPlainText, String storedEncryption) {
    boolean passwordVerification;

    if (null == storedEncryption || !storedEncryption.startsWith("$2a$")) {
        throw new java.lang.IllegalArgumentException(
                "Invalid encryption provided for comparison");
    }

    passwordVerification = checkpw(passwordAsPlainText, storedEncryption);

    return passwordVerification;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM