我试图在SQL查询中使用从用户获取的某些值,并尝试根据该输入进行搜索。我做了一些研究,并在网上发现了这一点。
st.executeQuery("SELECT * FROM Users WHERE UserName LIKE 'userName%'");
然后我尝试将其更改为
st.executeQuery("SELECT * FROM Users WHERE UserName='userName%'");
但那没用。我也尝试使用'@userName'
,但这也不起作用。所以现在我在这里,因为显然我犯了一些明显的错误,或者上述方法都不正确。现在,如果我硬编码值
st.executeQuery("SELECT * FROM Users WHERE UserName='Anwer'");
它工作正常。所以我认为我在如何使用程序的值上犯了错误。 我正在使用SQL Management Studio 2012编程语言Java。
答案 0 :(得分:1)
您应该使用绑定值而不是内联字符串。这容易发生SQL注入攻击(黑客巧妙地构造一个输入值,让他们运行任意SQL)。
类似的东西:
PreparedStatement ps = conn.prepareStatement("SELECT * FROM Users WHERE UserName=?");
ps.setString(1, "Anwer");
ResultSet resultSet = ps.executeQuery();
答案 1 :(得分:0)
如果您的用户名存储在名为userName
的变量中,您可以这样做:
st.executeQuery("SELECT * FROM Users WHERE UserName='" + userName + "'");
答案 2 :(得分:0)
当然,PreparedStatements是许多实现的绝佳选择。根据您的使用情况,请另外注意存储过程。存储过程可以由数据库编译,准备和优化PL / SQL,并由您的应用程序调用它。示例如下所示
String getUser= "{call getUser(?,?,?)}";
callableStatement = dbConnection.prepareCall(getUser);
callableStatement.setString(1, "sampleUserName");
callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.executeUpdate(); //Excecute Stored Procedure
String firstName = callableStatement.getString(2);
String LastName = callableStatement.getString(3);