Я разрабатываю страницу входа, где участники выполняют вход и регистрацию. У меня возникают проблемы, когда я сравниваю имя пользователя и пароль с данными пользователя в таблице базы данных. Этот фрагмент кода вызывает это исключение, но я не могу понять, что происходит не так. сервер выдает это сообщение:
javax.servlet.ServletException: java.sql.SQLException: Before start of result set
String search_in = "select USERNAME,PASSWORD from USERS";
ResultSet search_result= myStatement.executeQuery( search_in );
while( search_result.next() ){
a[i] = search_result.getString("USERNAME");
b[i] = search_result.getString("PASSWORD");
//new_username and new_password are form input parameters
if ( a[i].equals(new_username) && b[i].equals(new_password) ){
out.println("in if statement<br>");
found = true;
break;
}
i++;
}
опубликовать полный стек исключений




Сообщение об ошибке достаточно для устранения основной причины .. !!
javax.servlet.ServletException: java.sql.SQLException: Before start of result set
Это происходит, если мы пытаемся получить доступ к строке, которая не индексируется нашим курсором resultSet. Это что???
Когда мы запускаем запрос select, в результате мы можем получить несколько строк или одну строку или вообще ни одной строки (результат зависит от вашего запроса и данных).
Эти строки сохраняются в экземпляре resultSet.
Чтобы получить доступ к этим строкам, мы можем перебрать их в цикле с помощью resultSet.next() (или любыми другими способами ..). Поскольку вы использовали цикл while с функцией .next(), я рассматриваю то же самое.
Таким образом, эта функция next() фактически перемещает курсор в следующую строку, и первоначально она указывает на один индекс перед фактической строкой результата, то есть индексирует значение -1, поэтому, как только мы попадаем в цикл while, функция resultSet.next() перемещает курсор в на одну позицию вперед, т.е. впервые он будет указывать на фактическую строку в позиции 0 и так далее, пока не останется ничего для итерации.
Ошибка, о которой вы упомянули, связана с тем, что курсор изначально указывает на -1, и когда он пытается выполнить итерацию (т.е. перейти к действительно первой строке), он терпит неудачу, потому что из этого запроса не возвращается ни одна строка, и, следовательно, ошибка говорит before the start of ResultSet.
Я надеюсь, что это проясняет ваше представление о resultSet и дает представление о том, что происходит за кулисами.
Итак, предложение для вашей проблемы: попробуйте проверить / изменить свой запрос или посмотреть в базе данных, действительно ли он содержит какую-либо такую строку, которая должна быть возвращена по этому запросу или нет.
Если я понимаю, вы имеете в виду, что, возможно, у запроса или базы данных есть проблема? Но если вы напечатаете a [i] и b [i], он вернет мне данные, когда я вставлю их в таблицу
Хорошо..!! Значит, вы получаете значения a[i] и b[i] в том же блоке кода, который вы разместили, или на другой странице ?? Я имею в виду, как вы узнали его ценности ??
И я просто догадываюсь .., вы пытаетесь проверить логин пользователя с помощью вышеуказанного подхода ??
получить значения a [i] и b [i] внутри цикла while, потому что я напечатал для проверки, но когда я сравниваю со значениями формы в операторе if, он ничего не делает
у меня есть 2 записи только для тестирования параметров, которые я вставляю в форму, являются первой записью
Вы уверены, что new_username и new_password точно совпадают хотя бы с одной записью, я имею в виду, интервал и регистр тоже .. !!
Также см. Мой новый ответ, я сохранил старый, поскольку он предназначен для тех, кому нужно понять основную причину вышеуказанной ошибки. !!
Вместо того, чтобы извлекать все записи из базы данных и сравнивать значения в вашем код приложения, я бы посоветовал вам попросить базу данных предоставить вам записи в соответствии с вашими условиями.
Для этого измените свой запрос и код, как показано ниже.
String search_in = "select USERNAME,PASSWORD from USERS where USERNAME = ? AND PASSWORD = ?";
myStatement.setString(1, new_username); // assuming your column is varchar or text
myStatement.setString(2, new_password); // assuming your column is varchar or text
ResultSet search_result= myStatement.executeQuery( search_in );
if ( search_result.next() ){
out.println("in if statement<br>");
found = true;
}
Я нашел это. Проблема была не в проверке записей данных, а в другом выражении if, которое было после found == true. Спасибо за вашу помощь!
подумайте, пожалуйста, о голосовании .. !!
Опишите также свою таблицу БД