#java #mysql #where-clause #sql-delete
#java #mysql #where-предложение #sql-удалить
Вопрос:
Пытаюсь удалить запись из моей базы данных, но получаю сообщение об ошибке «Неизвестный столбец» в предложении where».
private void deleteUser() {
String query = "DELETE FROM user WHERE Name =" tfemail.getText() "";
executeQuery(query);
showUsers();
}
Комментарии:
1. Во-первых, используйте кавычки вокруг ваших значений (или лучше подготовленных операторов), а во-вторых, не храните пароль в виде обычного текста!!!
2. Распечатайте строковый запрос и проверьте, что вы сохраняете.
3. Не вставляйте текст от пользователя в инструкцию SQL. Это делает код уязвимым для атак с использованием SQL-инъекций , позволяя пользователю повреждать / уничтожать / красть ваши данные. Используйте a
PreparedStatement
или эквивалентный вспомогательный метод. Это также предотвращает подобные ошибки.4. но я получаю сообщение об ошибке «Неизвестный столбец» в предложении where»». Укажите: 1) точное значение
query
переменной, которая вызывает ошибку 2) полное и неизмененное сообщение об ошибке.5. Прогнозирование: нет одинарных кавычек, которые должны заключать буквальное значение, вставленное в текст запроса.
Ответ №1:
Вы не можете писать запросы таким образом. Представьте, что кто-то поместил в tfemail
поле этот текст:
"Joe' OR FALSE"
и давайте посмотрим, что это сделает с вашим SQL-запросом:
DELETE FROM user WHERE Name = 'Joe' OR FALSE;
прощай, база данных!
Некоторые базы данных позволяют выполнять данные на сервере, на котором работает движок БД. Это означает, что этот трюк можно использовать для полного взлома компьютера или полного форматирования диска. пока, вся машина.
Это также означает, что ваш executeQuery
метод необходимо удалить — эта абстракция («вот какой-то SQL, пожалуйста, запустите его») редко бывает полезной (поскольку она не может содержать никакого пользовательского ввода) и побуждает вас писать утечки безопасности.
Решение — подготовленные операторы:
PreparedStatement ps = con.prepareStatement("DELETE FROM user WHERE Name = ?");
ps.setString(1, "Joe");
ps.executeUpdate();
Это решает вашу проблему, и делает это безопасно — ps.setString(1, "Joe' OR FALSE");
теперь это больше не проблема (движок DB или драйвер JDBC гарантируют, что он позаботится о проблеме; результатом будет удаление записи в вашей пользовательской таблице, которая буквально читается как «Joe» ИЛИ FALSE»).
Кроме того, хранение паролей в базе данных не является приемлемой стратегией; решение, например, bcrypt: используйте алгоритм хеширования, разработанный специально для хранения паролей.
Комментарии:
1. Вот как выглядит хороший ответ: не просто «эй, ты пропустил очевидную вещь», но и объяснение, предотвращающее то, что может привести к очень плохим последствиям.
Ответ №2:
String query = "DELETE FROM user WHERE Name ='" tfemail.getText() "'";
^ ^
|___________add___________|
Комментарии:
1. @Kevin399 Не забудьте отметить свой вопрос как разрешенный с помощью этого ответа.
2. Нет, не надо. Это ужасный, ужасный ответ. Кажется, что это работает, но на самом деле это не так: это приведет к взлому вашего сервера . @Akina пожалуйста, удалите или обновите этот ответ.
3. @rzwitserloot Каждый имеет право поступать так, как хочет, в том числе совершать плохие поступки. Вы предупредили автора — этого достаточно. Smart учтет. Дурака не жалко.