Konstantin18ko
@Konstantin18ko
Стоматолог

Перевызов строки, дублирование запроса, как решить?

Есть цикл, который перебирает строки в БД и сравнивает их с веденной строкой.
Если строка повторяется, то пишет "Email занят". Иначе строка вносится в БД.

Есть проблема, если ввести сначала почту, которая уже есть в БД, а потом новую, то запрос первой будет дублироваться, после выполнения второй.

private static String checkemail(Connection emailconnect)  {
        String query = "SELECT COUNT(*) FROM testdatabase.signup;";// Задаем параметр запроса - количество строк
        String email = null;// Задаем переменную email, которая будет возвращена в случаи, если он уникален
        try {
            email = Signup.reademail(email);// считываем с клавиатуры email
            Statement statement = emailconnect.createStatement();//создал статемент
            ResultSet resultSet = statement.executeQuery(query);//сделал запрос, ответ записал в переменную
            int id = 0;
            while (resultSet.next()){
                id = resultSet.getInt(1); // считываю по стокам и перевожу количество строк в ID
            }
            int x = 0;// нумерация запроса
            int y = 1;// нумерация строки
            while (x < id){
                String emailid = "SELECT * FROM testdatabase.signup where id = " + y + ";";// строка запроса
                Statement statementemail = emailconnect.createStatement();//создание статемента
                ResultSet resultSetemail = statementemail.executeQuery(emailid);//получение результатов
                resultSetemail.next();// хз зачем эта строка, но без нее не работает (я знаю, что это для того чтоб читать построчно)
                String emailres = resultSetemail.getString(2);//записываем результат в строку
                System.out.println("Это строка " + email);
                System.out.println("Это результат с БД " + y + " " + emailres);
                if(email.equals(emailres)){ //сравниваем результат из БД и результат введенный с клавиатуры
                    System.out.println("E-mail занят");
                    Signup.checkemail(emailconnect);// если повторяется вызываем метод снова
                }
                x = x + 1;
                y = y + 1;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return email;// иначе возвращаем значение email
    }

    private static String reademail(String email) {
        System.out.println("Введите E-mail:");//Объявил
        Scanner scanneremail = new Scanner(System.in);//метод
        email = scanneremail.nextLine();//scanner() для считывания строки
        return email;//вернул его значение


Вот результат, когда вводишь сначала уже имеющийся email, потом новый email.

Соединение с БД установлено!
Введите E-mail:
18ko@mail.ru
Это строка 18ko@mail.ru
Это результат с БД 1 18ko@mail.ru
E-mail занят
Введите E-mail:
45ff@mail.ru
Это строка 45ff@mail.ru
Это результат с БД 1 18ko@mail.ru
Это строка 45ff@mail.ru
Это результат с БД 2 19lp@mail.ru
Это строка 45ff@mail.ru
Это результат с БД 3 20ji@mail.ru
Это строка 45ff@mail.ru
Это результат с БД 4 18ko@mail.ru
Это строка 18ko@mail.ru
Это результат с БД 2 19lp@mail.ru
Это строка 18ko@mail.ru
Это результат с БД 3 20ji@mail.ru
Это строка 18ko@mail.ru
Это результат с БД 4 18ko@mail.ru
E-mail занят
Введите E-mail:

То есть запрос к БД идет так:
Читает первую строку 1, нашел совпадение. Пишет что email занят и просит ввести новый. Вводим новый e mail.
Запросы:
1
2
3
4
Возвращается к старому запросу.
2
3
4

Как лечить?
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Перенесите функционал поиска email на базу данных
select id from testdatabase.signup where email = <email>

Если вернулось id то email есть.
Это в разы упростит ваш код
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы