Как сделать запись в предложении where, когда мы используем его на веб-страницах? - PullRequest
0 голосов
/ 20 февраля 2009

В зависимости от ввода пользователя я хочу выбрать запись из базы данных. Это мой код:

<%
String jempid=request.getParameter("empid");
out.println(jempid);
int intempid=1223;
Connection conn=null;
String url="jdbc:mysql://localhost/employees";
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn=DriverManager.getConnection(url,"root","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select * from empdetails where empnum=jempid");
%>

Выдает следующую ошибку

javax.servlet.ServletException: java.sql.SQLException: неизвестный столбец 'jempid' в 'где предложение

Ответы [ 9 ]

5 голосов
/ 20 февраля 2009

Это плохая идея создавать SQL с использованием конкатенации строк - вы просто открываете себя для атаки SQL-инъекцией - ОСОБЕННО, учитывая, что вы получаете значение empid непосредственно из запроса. Хлоп!

Лучшим подходом является использование параметризованного запроса, например ниже:

PreparedStatement st=conn.prepareStatement("select * from empdetails where empnum=?");
st.setString(1, jempid);
ResultSet rs=st.executeQuery();

Также вы должны проверить, что jempid не равен нулю.

3 голосов
/ 20 февраля 2009

Вот ваше выбранное утверждение:

select * from empdetails where empnum=jempid

jempid жестко запрограммирован вместо использования в качестве переменной. Это никогда не будет работать, если вы не измените его на значение переменной, введенное клиентом.

изменить на:

"select * from empdetails where empnum=" + CleanseUserInput(jempid)

и ты в порядке.

1 голос
/ 01 октября 2017

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

так скажем, у нас есть запрос типа select * from bikes, где bikename = hayabusa;

если вы нажмете на этот запрос, то он может выдать ошибку, например, неизвестный столбец, поэтому лучше всего позаботиться о том, чтобы указать значение, которое вы даете в предложении , где , поэтому правильный путь выглядит как 1009 * выберите * из велосипедов, где bikename = 'hayabusa';

1 голос
/ 20 февраля 2009

Это выглядит как слишком много кода на странице JSP .... что сказал:

... empnum='"+jempid+"');" ......

А также, когда вы закончите, обязательно закройте БД тоже

0 голосов
/ 22 декабря 2016

where должен иметь ввод в пределах " ". Как это:

"select * from empdetails where empnum = "jempid";

Следовательно, это должно работать:

ResultSet rs = st.executeQuery("select * from empdetails where empnum=" +"'"+ jempid+"'");
0 голосов
/ 20 февраля 2009

В отличие от других ответов, почему бы не использовать PreparedStatement?

По сути, вам придется кодировать так:

PreparedStatement st=conn.prepareStatement("select * from empdetails where empnum=?");
st.setString(1, jempId);
ResultSet rs=st.executeQuery();

Причина, по которой вы должны использовать PreparedStatements, связана с SQL-инъекцией проблем. Например, используя код, который вы разместили в вопросе, хакер всегда может ввести «1; удалить * из empdetails» в текстовое поле, из которого вы выбираете jempid.

Таким образом, окончательный сформированный запрос будет

select * from empdetails where empnum=1;delete * from empdetails

, что приведет к удалению всех данных в empdetails.

Так что всегда используйте PreparedStatements !!

0 голосов
/ 20 февраля 2009
"select * from empdetails where empnum="+jempid

Но вы действительно хотите защитить это от SQL-инъекций!

0 голосов
/ 20 февраля 2009
ResultSet 
  rs=st.executeQuery("select * from empdetails where empnum=" + jempid + ";")
0 голосов
/ 20 февраля 2009

Попробуйте это:

ResultSet rs=st.executeQuery(
    "select * from empdetails where empnum=" + jempid);

Вы должны поместить значение jempid в строку, а не text"jempid".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...