2009-02-20 4 views
0

Selon l'entrée de l'utilisateur, je veux sélectionner l'enregistrement de la base de données. Ceci est mon code:Comment donner une entrée dans la clause where lorsque nous l'utilisons dans des pages Web?

 
<% 
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"); 
%> 

Il jette l'erreur suivante

javax.servlet.ServletException: java.sql.SQLException: Unknown column 'jempid' dans « où la clause

+0

he he .. aucun code n'est parfait. – Learning

+0

Là, fixé cela pour toi. – paxdiablo

+0

Vous ne pouvez pas obtenir Pax .. – user67722

Répondre

1

qui ressemble comme trop de code dans une page jsp .... que dit:

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

Et lorsque vous avez terminé assurez-vous de clos e db trop

+0

Oui, @rbobby, mais pas vraiment pertinent à la question. – paxdiablo

0

Essayez ceci:

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

Vous devez mettre la valeur de jempid dans la chaîne, pas le texte "jempid".

+0

Oui, @rbobby, mais pas vraiment pertinent à la question à portée de main. Nous savons tous que vous ne devriez pas permettre les attaques par injection, mais si vous vouliez couvrir chaque cas où une réponse était «fausse», ils finiraient tous par être des essais de 10 000 mots. – paxdiablo

+0

Vous pourriez tout aussi bien dire que nous aurions dû supprimer le code inutile, comme "int intempid = 1223;" :-) – paxdiablo

3

Voici votre instruction select:

select * from empdetails where empnum=jempid 

jempid est hardcoded au lieu d'être utilisé comme une variable. Cela ne fonctionnera jamais, sauf si vous le modifiez à la valeur de la variable entrée par le client.

alter:

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

et vous êtes bon pour aller.

+0

Merci d'avoir souligné le risque d'injection sql –

+0

Et c'est un excellent exemple pourquoi vous ne devriez pas couvrir tout dans une réponse, @rbobby. Et si le jempid était une chaîne? Cela nécessiterait des citations. Mieux vaut répondre à la question plutôt que d'essayer de couvrir toutes les bases. – paxdiablo

+0

@Pax, bon point, mais les développeurs sont notoirement mauvais pour permettre des attaques par injection SQL. –

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

Mais vous voulez vraiment protéger cette contre les injections SQL!

5

C'est une mauvaise idée de construire SQL en utilisant la concaténation de chaînes - vous vous ouvrez à une attaque par injection SQL - EN PARTICULIER considérant que vous obtenez la valeur de "empid" directement à partir de la requête. Yikes!

Une meilleure approche est d'utiliser une requête paramétrée, comme ci-dessous:

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

Aussi, vous devez vérifier que jempid est non nul.

+0

Bon pour englober tous les cas, mais vraiment le seul problème ici était qu'il a oublié de faire de jempID une variable. Cet effort pourrait encore embrouiller celui qui a écrit le code original. –

+0

@Chris, à droite - mais d'autres développeurs qui viennent ici peuvent toujours apprendre d'autres façons de le faire. –

+0

Si quelqu'un vous demande "Hey - pourquoi je ne peux pas me tirer dans le pied?" - Armez-vous le pistolet ou le prendre loin d'eux? –

0

Contrairement à d'autres réponses, pourquoi ne pas utiliser un PreparedStatement?

Fondamentalement, vous aurez à code comme ceci:

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

La raison pour laquelle vous devez utiliser PreparedStatements est à cause de problèmes SQL Injection. Par exemple, en utilisant le code que vous avez posté dans la question, un pirate peut toujours taper "1; delete * from empdetails" dans la zone de texte à partir de laquelle vous sélectionnez jempid.

Ainsi, la requête finale formée serait

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

qui entraînerait toutes les données empdetails obtenir supprimé.

Alors utilisez toujours PreparedStatements !!

0

where doit avoir l'entrée dans " ". Comme ceci:

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

Par conséquent cela devrait fonctionner:

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

oui parfois, il renvoie une erreur de la colonne unkown dire par exemple, nous avons des vélos de table

permet donc dire que nous avons une requête comme sélectionnez * parmi les vélos où bikename = hayabusa;

si vous appuyez sur cette requête qu'elle pourrait lancer une erreur comme colonne inconnue de sorte que la meilleure chose que vous devez prendre soin est indiquez votre valeur ehich vous donnez à clause de sorte que la façon correcte se passe comme select * des motos où bikename = 'hayabusa';

Questions connexes