#java #mysql #jdbc
#java #mysql #jdbc
Вопрос:
Я создаю приложение, в котором я пытаюсь войти в систему пользователя с данными, которые хранятся на сервере MySQL. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь войти в систему с правильным именем пользователя и паролем, мой код фактически проверяет каждую запись в моей таблице ‘adminData’ и показывает мне соответствующие результаты для каждой записи! Я также прилагаю свой код, пожалуйста, взгляните! Итак, я хочу спросить, как я могу выполнять поиск только по одной конкретной записи, и это вернет меня только к этой конкретной записи! Пожалуйста, помогите мне .. 🙂
btnSubmit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String query = "SELECT username, password FROM adminData";
String username = null;
String password = null;
;
try
{
rs = st.executeQuery(query);
String fieldWarning = "*all field are mandatory!";
String enteredUsername = usernameField.getText();
@SuppressWarnings("deprecation") String enteredPassword = passwordField.getText();
usernameField.setCursor(null);
fieldLabel.setText("");
int userLen = enteredUsername.length();
int passLen = enteredPassword.length();
if (userLen != 0 amp;amp; passLen != 0)
{
if (userLen <= 32 amp;amp; passLen <= 32)
{
while (rs.next())
{
username = rs.getString("username");
password = rs.getString("password");
if (enteredUsername.equals(username))
{
if (enteredPassword.contentEquals(password))
{
AdminDashboard frame = new AdminDashboard();
frame.setVisible(true);
frame.dispose();
}
else
{
JOptionPane.showMessageDialog(null, "Password Missmatch");
}
}
else
{
JOptionPane.showMessageDialog(null, "Invalid User");
passwordField.setText("");
usernameField.setText("");
usernameField.setCursor(null);
}
}
}
else
{
JOptionPane.showMessageDialog(null,
"Please enter a valid username or password! n(Note: Only 32 char MAX)");
passwordField.setText("");
usernameField.setText("");
}
}
else
{
fieldLabel.setText(fieldWarning);
usernameField.setCursor(null);
}
}
catch (SQLException e1)
{
JOptionPane.showMessageDialog(null, "Database Error: " e1);
}
}
});
Комментарии:
1. какой первичный ключ в вашей таблице?
2. основным является ‘id’, который автоматически увеличивается, и я сделал атрибут ‘username’ уникальным
3. Строковый запрос = «ВЫБЕРИТЕ имя пользователя, пароль ИЗ adminData, ГДЕ id = ‘» id «‘»;
4. username= rs.getString(«имя пользователя»); password= rs.getString(«пароль»); выведите эти поля из цикла while.
5. Слишком много проблем, чтобы дать ответ. Для начала, пожалуйста, не храните пароли пользователей в виде открытого текста в таблице вашей базы данных.
Ответ №1:
Это потому, что ваш запрос возвращает вам всю таблицу. Если у вас есть имя пользователя, вы можете просто настроить свой запрос, чтобы возвращать только строку, содержащую сведения об этом конкретном пользователе, а не обо всех пользователях. Итак, просто назначьте enteredUsername перед запросом и добавьте условие username в свой sql-запрос.
btnSubmit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String enteredUsername = usernameField.getText();
String query = "SELECT username, password FROM adminData WHERE username='" enteredUsername "'";
String username = null;
String password = null;
;
try
{
rs = st.executeQuery(query);
String fieldWarning = "*all field are mandatory!";
@SuppressWarnings("deprecation") String enteredPassword = passwordField.getText();
usernameField.setCursor(null);
fieldLabel.setText("");
int userLen = enteredUsername.length();
int passLen = enteredPassword.length();
if (userLen != 0 amp;amp; passLen != 0)
{
if (userLen <= 32 amp;amp; passLen <= 32)
{
while (rs.next())
{
username = rs.getString("username");
password = rs.getString("password");
if (enteredUsername.equals(username))
{
if (enteredPassword.contentEquals(password))
{
AdminDashboard frame = new AdminDashboard();
frame.setVisible(true);
frame.dispose();
}
else
{
JOptionPane.showMessageDialog(null, "Password Missmatch");
}
}
else
{
JOptionPane.showMessageDialog(null, "Invalid User");
passwordField.setText("");
usernameField.setText("");
usernameField.setCursor(null);
}
}
}
else
{
JOptionPane.showMessageDialog(null,
"Please enter a valid username or password! n(Note: Only 32 char MAX)");
passwordField.setText("");
usernameField.setText("");
}
}
else
{
fieldLabel.setText(fieldWarning);
usernameField.setCursor(null);
}
}
catch (SQLException e1)
{
JOptionPane.showMessageDialog(null, "Database Error: " e1);
}
}
});
Теперь он всегда будет возвращать одну запись, если ваши имена пользователей уникальны.
Комментарии:
1. Не делайте этого таким образом:
String query = "SELECT username, password FROM adminData WHERE username='" enteredUsername "'";
Этот код подвержен влиянию SQL-инъекции, используйтеPreparedStatement
вместо этого with parameters.2. Что вы предлагаете?
3. Строковый запрос = «ВЫБЕРИТЕ имя пользователя, пароль ИЗ adminData, ГДЕ username=?»; … подключение. prepareStatement(запрос).setString(1, введенное имя пользователя).execute()
4. @a.yekimov Использование подготовленного оператора — правильный путь, но JDBC API не позволяет связывать методы таким образом.
5. Не забудьте закрыть результирующий набор:)